LINQ: как преобразовать список, выполнив вычисления для каждого элемента - PullRequest
2 голосов
/ 08 июня 2010

У меня есть класс

Class MyObject
{
    decimal v1;
    decimal dv1;
    decimal v2;
    decimal dv2;
}

и

List<MyObject> ...

Мне нужно обработать каждый элемент списка, добавив dv1 к v1 и dv2 к v2 что-то вроде (псевдо-синтаксис):

myList.Transform(o=>o.v1+=o.dv1, o.v2+=o.dv2)

Как я могу это сделать (очевидно, мой псевдосинтаксис не работает)?

Спасибо

Ответы [ 5 ]

6 голосов
/ 08 июня 2010

LINQ предназначен для получения подмножества данного перечисления или для создания перечисления с новыми типами из списка.

Чтобы манипулировать данным списком, LINQ не является подходящим инструментом для манипулирования данным списком. Чтобы выполнить свою задачу, вы должны использовать цикл foreach, например

foreach(var item in objects)
{
    item.v1 += obj.dv1;
}

Что вы можете сделать, так это предварительно выбрать, какие элементы из объектов вы хотите подобным образом

foreach(var item in object.Where(o => o.v1 % 2 == 0))

Как уже упоминалось, вы можете самостоятельно реализовать метод расширения ForEach(), но есть причина, по которой он не существует:
Взгляните на Erics Blog запись .

5 голосов
/ 08 июня 2010

Вы можете использовать метод ForEach для списка:

List<MyObject> objects = new List<MyObject>();

// Populate list.

objects.ForEach(obj => {
  obj.v1 += obj.dv1;
  obj.v2 += obj.dv2;
});
2 голосов
/ 08 июня 2010

LINQ предлагает «выбрать» для преобразования

list.Select( obj => new MyObject(obj.v1 + obj.dv1, obj.dv1, obj.v2 + obj.dv2, obj.dv2))

Но учтите, что возвращаемое значение - это новый список; элементы исходного списка не изменяются. Нет побочных эффектов / состояние мутации. Если это ваша цель, выбирайте; иначе используйте for / for-each, как предлагали другие.

0 голосов
/ 08 июня 2010

Спасибо за все ответы. Я думал, что linq может предоставить элегантный способ, но вы правы - foreach делает эту работу просто правильно.

0 голосов
/ 08 июня 2010

Я не думаю, что это типичная задача для linq, но если вы хотите, вы можете сделать это:

List<MyClass> objects = GetMyClasses();
Func<Action<MyClas>s, bool> do = (action) => { action(); return true; }
(from o in objects
 where do( o, b=> { b.v1 += b.dv1; b.v2 += b.dv2; } )
 select o).ToArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...