使用LINQ更新实体列表中的属性

使用LINQ更新实体列表中的属性,linq,Linq,假设我有一个实体,看起来像这个简单的例子: MyEntity { int property1; int property2; int property3; } 现在假设我有一个这些实体的IEnumerable列表。我是否可以执行LINQ查询,将列表中每个实体的property1值设置为100?我知道我可以通过foreach实现这一点,但我想知道LINQ是否可以更优雅地实现这一点。如果您有100个属性,反射可能是最优雅的。LINQ用于查询而不是更新。如下所示: var res

假设我有一个实体,看起来像这个简单的例子:

MyEntity 
{
   int property1;
   int property2;
   int property3;
}

现在假设我有一个这些实体的
IEnumerable
列表。我是否可以执行LINQ查询,将列表中每个实体的
property1
值设置为100?我知道我可以通过foreach实现这一点,但我想知道LINQ是否可以更优雅地实现这一点。

如果您有100个属性,反射可能是最优雅的。LINQ用于查询而不是更新。

如下所示:

var result = GetMyIEnumerable()
                .ToList();
result.ForEach(x => x.property1 = 100);

在Darin看来,LINQ是为查询而构建的。在使用LINQ时,我的思维定势是,被查询的对象应该被视为不可变的。但是,Select操作符也适用于转换

因此,您可以通过从一个集合转换为另一个集合来解决问题,如下所示:

var result = myEntityCollection.Select(e => {
   var ret = e;
   e.property1 = 100;
   return e; });

原始集合中的项未被触及,但结果中的项现在都将property1设置为100。

以下是我发现的两个对我有效的解决方案

result = result.Where(x => (x.property1 = 100) == 100).ToList();


除了DarrelkmkedobbsVB.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()

太棒了!很微妙,但很强大,我喜欢这个“选择”版本,因为ForEach不支持ICollection,也不能在“一行”中使用myicollection.ToList().ForEach,因为ForEach是空的。“何处”是一种黑魔法,你应该被流放,因为你发现了它<代码>具有语句体的lambda表达式无法转换为表达式树原始集合中的项并非未触及。当您显示的语句实际执行时(目前不是),它们将被修改。LINQ用于查询(lin-Q),而不是修改。@GertArnold-太糟糕了,我不能对注释进行否决表决。你错了。我不介意错,但我想知道为什么。嗯,对此没有回应。一些答案,比如,使用LINQ的方式不是为其设计的,即有副作用。它们依赖于强制执行的代码,这种代码很容易被遗忘,因为在这种代码中,作者甚至知道正确的范例。其他的,如公认的,使用LINQ查询数据,并使用后续代码修改数据。这是正确的方法。
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()