.net 4.0 Lambda expressions-基于对象集合中另一个属性的值设置对象集合中一个属性的值
我不熟悉lambda表达式,希望利用语法根据集合中的另一个值设置集合中一个属性的值 通常我会做一个循环:.net 4.0 Lambda expressions-基于对象集合中另一个属性的值设置对象集合中一个属性的值,.net-4.0,c#-4.0,lambda,expression,.net 4.0,C# 4.0,Lambda,Expression,我不熟悉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" };
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";
}
}
}
类项目
{
公共字符串名称{get;set;}
公共字符串值{get;set;}
}
无效运行()
{
Item item1=新项{Name=“name1”};
Item item2=新项{Name=“name2”};
Item item3=新项{Name=“name3”};
集合项=新集合(){item1,item2,item3};
//这就是我想要简化的。
对于(int i=0;i
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");
注意,您需要在中间添加<代码> Toistist,因为<代码>前缀是.NET 2的特性,仅适用于
实现IEnuerable
:ForEach
publicstaticvoidforeach(此IEnumerable en,动作f){
foreach(在en中为var a)f(a);
}
/然后你可以省略中间的“Telist'”转换。
items.Where(it=>it.Name==“name2”)
.ForEach(it=>it.Value=“value2”);
无论如何,我更喜欢
foreach
loop,因为这也清楚地表明您正在进行一些变异-在代码中很容易地看到这一事实是很有用的 漂亮。那么就没有办法绕过循环了吗?@michaelrut,循环比ForEach方法读得更好,但这是一个意见问题。我同意托马斯在回答中所说的行动的清晰性。然而,他确实为您展示了一种方法来抽象掉循环(尽管显然循环仍然会发生,而不是显式编码)。如果我想在设置值后更新db,哪一种方法适合对db的影响较小?性能将是相同的-它们都将生成相同数量的update
语句(提交更改时)。
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");