Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 4.0 Lambda expressions-基于对象集合中另一个属性的值设置对象集合中一个属性的值_.net 4.0_C# 4.0_Lambda_Expression - Fatal编程技术网

.net 4.0 Lambda expressions-基于对象集合中另一个属性的值设置对象集合中一个属性的值

.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" };

我不熟悉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";
        }
    }
}
类项目
{
公共字符串名称{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的特性,仅适用于List类型-不是所有的<代码> iQueaby< /Cord>类型(作为其他LINQ方法)。如果您喜欢这种方法,可以为

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");