2010-05-02 3 views
1

У меня есть список, какLinq Агрегатной функция

«тест», «л», «что-то», «другой»

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

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

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

и в то время как я ставлю точку останова в функции SomeMethod, где происходит некоторое преобразование на информацию в MyList, я заметил, что после 3-го звонка я получаю результат прежнее преобразование в качестве входного параметра.

+5

Я не могу расшифровать, что спрашивают здесь; Я предлагаю вам опубликовать код, который вы используете, и описание ожидаемых/фактических результатов. – Aaronaught

+0

@ Ааронированный это не так загадочно (если u использовал Aggregate), imo OP просто путают по параметрам агрегатной функции – eglasius

+0

Возможный дубликат [Алгоритм LING Aggregate объяснен] (http://stackoverflow.com/questions/7105505/LINQ-агрегатно-алгоритм-объяснено) – Jamiec

ответ

1

Так оно и должно работать.

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

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

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

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

0

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

 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; 
          }); 
Смежные вопросы