我是lambda表达式的新手,希望利用语法根据集合中的另一个值设置集合中一个属性的值
通常我会做一个循环:
class Item
{
public string Name { get; set; }
public string Value { get; set; }
}
void Run()
{
Item item1 = new Item { Name = "name1" };
Item item2 = new Item { Name = "name2" };
Item item3 = new Item { Name = "name3" };
Collection<Item> items = new Collection<Item>() { item1, item2, item3 };
// This is what I want to simplify.
for (int i = 0; i < items.Count; i++)
{
if (items[i].Name == "name2")
{
// Set the value.
items[i].Value = "value2";
}
}
}
答案 0 :(得分:16)
LINQ对于选择数据通常比修改数据更有用。但是,你可以这样写:
foreach(var item in items.Where(it => it.Name == "name2"))
item.Value = "value2";
首先选择需要修改的项目,然后使用标准的命令式循环修改所有项目。您可以使用可用于列表的foreach
方法替换ForAll
循环,但我认为这不会给您带来任何好处:
items.Where(it => it.Name == "name2").ToList()
.ForEach(it => it.Value = "value2");
请注意,您需要在中间添加ToList
,因为ForEach
是仅适用于List<T>
类型的.NET 2.0功能 - 不适用于所有IEnumerable<T>
类型(作为其他LINQ方法)。如果您喜欢这种方法,则可以为ForEach
实施IEnuerable<T>
:
public static void ForEach<T>(this IEnumerable<T> en, Action<T> f) {
foreach(var a in en) f(a);
}
// Then you can omit the `ToList` conversion in the middle
items.Where(it => it.Name == "name2")
.ForEach(it => it.Value = "value2");
无论如何,我更喜欢foreach
循环,因为这也说明你正在做一些变异 - 而且在代码中很容易看到这个事实。