Агрегатная функция Linq

У меня есть список вроде

"тест", "бла", "что-то", "другое"

Но когда я использую на нем Aggrate и тем временем вызываю функцию, мне кажется, что после 2 «итераций» передается результат первой?

Я использую его как:

myList.Aggregate((current, next) => someMethod(current) + ", "+ someMethod(next));

и пока я ставлю точку останова в функции someMethod, где происходит некоторое преобразование информации в myList, я замечаю, что после третьего вызова я получаю результат предыдущего преобразования в качестве входного параметра.


person Nyla Pareska    schedule 02.05.2010    source источник
comment
Я не могу расшифровать, что здесь спрашивают; Я предлагаю вам опубликовать код, который вы используете, и описание ожидаемых/фактических результатов.   -  person Aaronaught    schedule 02.05.2010
comment
@Aaronaught, это не так загадочно (если вы использовали Aggregate), imo, OP просто запутался в параметрах агрегатной функции.   -  person eglasius    schedule 04.05.2010
comment
Возможный дубликат объяснение алгоритма LINQ Aggregate   -  person Jamiec    schedule 05.10.2015


Ответы (2)


Именно так он должен работать.

То, что вы назвали текущим, должно быть всем, что было накоплено до сих пор. При первом вызове seed является первым элементом.

Вы можете сделать что-то вроде:

var res = myList
   .Aggregate(String.Empty, (accumulated, next) => accumulated+ ", "+ someMethod(next))
   .Substring(2);//take out the first ", "

Таким образом, вы применяете someMethod только один раз к каждому элементу.

person eglasius    schedule 04.05.2010

Если бы мой список был списком строк, и я хотел бы вернуть/манипулировать только определенными элементами, я бы обычно делал что-то вроде этого:

     var NewCollection = MyStringCollection
                             //filter with where clause
                             .Where(StringItem => StringItem == "xyz"
                             //select/manipulate with aggregate
                             .Aggregate(default(string.empty), (av, e) =>
                             {
                                 //do stuff
                                 return av ?? e;
                             });
person Tresto    schedule 02.01.2012