Znalazłem w próbkach Linq MSDN zgrabną metodę o nazwie Fold (), której chcę użyć. Ich przykład:
double[] doubles = { 1.7, 2.3, 1.9, 4.1, 2.9 };
double product =
doubles.Fold((runningProduct, nextFactor) => runningProduct * nextFactor);
Niestety, nie mogę tego skompilować, ani w ich przykładzie, ani we własnym kodzie i nie mogę znaleźć nigdzie indziej w MSDN (jak metody rozszerzenia Enumerable lub Array), które wspominają o tej metodzie. Pojawiający się błąd to zwykły stary błąd „nie wiem nic o tym”:
error CS1061: 'System.Array' does not contain a definition for 'Fold' and no
extension method 'Fold' accepting a first argument of type 'System.Array' could
be found (are you missing a using directive or an assembly reference?)
Używam innych metod, które, jak sądzę, pochodzą z Linq (jak Select () i Where ()), i używam System.Linq, więc myślę, że to wszystko w porządku.
Czy ta metoda naprawdę istnieje w C # 3.5, a jeśli tak, to co robię źle?
c#
linq
extension-methods
reduce
Rozpoznać
źródło
źródło
Odpowiedzi:
Będziesz chciał użyć
Aggregate
metody rozszerzenia:double product = doubles.Aggregate(1.0, (prod, next) => prod * next);
Aby uzyskać więcej informacji, zobacz MSDN . Pozwala określić a,
seed
a następnie wyrażenie w celu obliczenia kolejnych wartości.źródło
Func
wywoływana jest dopiero po osiągnięciu drugiego elementu. Zobacz: msdn.microsoft.com/en-us/library/vstudio/…ToString()
, w ten sposób zwrócić reprezentację tekstową całego kontenera.<double>
Parametr typ jest po prostu automatycznie wnioskować przez kompilator, a zatem nie jest konieczne.p
ielem
może być dowolnym typem. Zobacz to przeciążenie użyte w tym przykładzieFold (inaczej Reduce) to standardowy termin z programowania funkcjonalnego. Z jakiegoś powodu otrzymał nazwę Aggregate w LINQ.
double product = doubles.Aggregate(1.0, (runningProduct, nextFactor) => runningProduct* nextFactor);
źródło