Ответ 1
Вот так:
var result = GetMyIEnumerable()
.ToList();
result.ForEach(x => x.property1 = 100);
Скажем, у меня есть сущность, которая выглядит примерно так:
MyEntity
{
int property1;
int property2;
int property3;
}
Теперь предположим, что у меня есть список IEnumerable
этих entites. Есть ли запрос LINQ, который я могу выполнить, чтобы установить значение property1
равным 100 для каждого объекта в списке? Я знаю, что могу сделать это через foreach, но задавался вопросом, может ли LINQ сделать это более элегантно.
Вот так:
var result = GetMyIEnumerable()
.ToList();
result.ForEach(x => x.property1 = 100);
В точку Дарина LINQ построен для запросов. Я пришел к выводу, что при работе с LINQ объекты, которые запрашиваются, должны рассматриваться как неизменные. Однако оператор Select также отлично подходит для преобразований.
Итак, вы можете решить свою проблему, перейдя из одного набора в другой следующим образом:
var result = myEntityCollection.Select(e => {
var ret = e;
e.property1 = 100;
return e; });
Элементы в исходной коллекции нетронуты, но теперь элементы в результате имеют свойство1, установленное в 100.
Вот два решения, которые я нашел, которые работали для меня.
result = result.Where(x => (x.property1 = 100) == 100).ToList();
или
result = result.Select(c => { c.property1 = 100; return c; }).ToList();
Если у вас есть 100 свойств, возможно, отражение будет самым элегантным. LINQ для запроса не обновляется.
В дополнение к Darrelk и mkedobbs, код VB.NET:
object.list =
object.list.Select(Function(x)
x.property = If(x.property.Length > 3, x.property.Substring(0, 3), x.property)
Return x
End Function).ToList()