Change some value inside the List<T>
我有一些列表(其中t是一个自定义类,类有一些属性)。我想知道如何使用lambda表达式更改其中一个或多个值,因此结果将与下面的foreach循环相同:
注意:列表中包含多个项目(多行)
1 2 3 4 5 | foreach (MyClass mc in list) { if (mc.Name =="height") mc.Value = 30; } |
这就是LINQ查询(使用lambda表达式),但它与上foreach循环不同,它只从列表中返回1个项(一行)!
我想要的是,它返回所有项(所有行),并且只更改相应的项(在WHERE扩展方法中指定的项)。
1 | list = list.Where(w => w.Name =="height").Select(s => { s.Value = 30; return s; }).ToList(); |
注意:这两个例子不一样!重复一遍,LINQ只返回1个项目(一行),这是我不想要的,我也需要列表中的所有项目(如foreach循环,它只做更改,但不删除任何项目)。
您可以使用
1 | list.Where(w => w.Name =="height").ToList().ForEach(s => s.Value = 30); |
我可能会这样做(我知道它不是纯LINQ),如果您想保留所有项目,请保留对原始列表的引用,并且您应该发现更新后的值在其中:
1 2 | foreach (var mc in list.Where(x => x.Name =="height")) mc.Value = 30; |
埃多克斯1〔6〕怎么样这个很好用。我知道这是一个古老的帖子,但我只是想知道为什么没有人建议这样做?这个代码有缺点吗?
您可以使用带有语句lambda的投影,但是原始的
1 2 3 4 5 | var result = list.Select(i => { if (i.Name =="height") i.Value = 30; return i; }).ToList(); |
扩展方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public static IEnumerable<MyClass> SetHeights( this IEnumerable<MyClass> source, int value) { foreach (var item in source) { if (item.Name =="height") { item.Value = value; } yield return item; } } var result = list.SetHeights(30).ToList(); |
你可以这样做:
1 2 |
但我宁愿选择使用