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

Ran*_*der 54 linq

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

MyEntity 
{
   int property1;
   int property2;
   int property3;
}
Run Code Online (Sandbox Code Playgroud)

现在假设我IEnumerable列出了这些参与者.是否有可以执行的LINQ查询,它会property1为列表中的每个实体设置值为100?我知道我可以通过foreach做到这一点,但是想知道LINQ是否可以更优雅地做到这一点.

Bru*_*eis 103

像这样:

var result = GetMyIEnumerable()
                .ToList();
result.ForEach(x => x.property1 = 100);
Run Code Online (Sandbox Code Playgroud)

  • 绝对精彩!如此微妙但强大 (2认同)

mke*_*bbs 15

至于Darin的观点,LINQ是为查询而构建的.在使用LINQ时,我已经深入思考了被查询的对象应该被视为不可变的.但是,Select运算符也非常适合转换.

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

var result = myEntityCollection.Select(e => {
   var ret = e;
   e.property1 = 100;
   return e; });
Run Code Online (Sandbox Code Playgroud)

原始集合中的项目不受影响,但结果中的项目现在都将property1设置为100.

  • 原始收藏中的物品*并非*未受影响。当您显示的语句实际执行时(目前尚未执行),它们将被修改。 (2认同)

Dar*_*elk 6

这是我发现对我有用的两个解决方案。

result = result.Where(x => (x.property1 = 100) == 100).ToList();
Run Code Online (Sandbox Code Playgroud)

要么

result = result.Select(c => { c.property1 = 100; return c; }).ToList();
Run Code Online (Sandbox Code Playgroud)

  • 与ForEach相比,我更喜欢此“选择”版本,因为ForEach在ICollection <T>上不起作用,并且您无法在“单线”中执行myicollection.ToList()。ForEach,因为ForEach无效。但是,“ Where”版本是不可思议的魔术,您应该被放逐以便发现。;) (2认同)

Dar*_*rov 5

如果你有 100 个属性,也许反射会是最优雅的。用于查询的 LINQ 不更新。