如何在C#中更新IEnumerable列表的特定元素的属性

时间:2013-09-24 17:20:15

标签: c# linq ienumerable

我有一个IEnumerable列表,IEnumerable<SortElement>排序;

我正在更新其财产:

sorts.Where(a => a.DisplayName.ToLower() == "abc")
    .ToList()
    .ForEach(sl => sl.DisplayName = "Testing");

但它不会改变该特定元素的属性。

3 个答案:

答案 0 :(得分:5)

"ABC"更改为"abc"。你的病情永远不会得到满足。您也可以将.ToLower()更改为.ToUpper()

我会做这样的事情:

foreach(var e in sorts.Where(a => a.DisplayName.ToLower() == "abc"))
   e.DisplayName = "Testing";

因为你的代码实际上执行了2个循环,所以没有必要。

答案 1 :(得分:3)

LINQ更适合查询,它不是修改的好选择。

您可以修改列表项,如:

foreach (var item in sorts)
{
    if (item.DisplayName.Equals("abc", StringComparison.InvariantCultureIgnoreCase))
    {
        item.DisplayName = "Testing";
    }
}

OR

foreach (var item in 
    sorts.Where(r=> r.DisplayName.Equals("abc", StringComparison.InvariantCultureIgnoreCase)))
{
        item.DisplayName = "Testing";
}

使用string.Equals重载进行不区分大小写的比较。

有一种纯粹的LINQ方式,但请不要。 LINQ用于查询,而不是用于修改。它应该只有SortElement是一个类而不是结构,因为传递给lambda的引用类型。

sorts.Select(r => r.DisplayName.Equals("abc", StringComparison.InvariantCultureIgnoreCase)
                ? r.DisplayName = "Testing"
                : r.DisplayName ).ToList();

即使没有将结果分配回sorts,上述内容仍然有效。但应该避免。

答案 2 :(得分:0)

您可以使用就地更新 - SelectToList来实现此目标。

Select中将已过滤的列表更改为所需的值并执行ToList以便由于延迟评估而立即评估选择 -

sorts.Where(a => a.DisplayName.ToUpper() == "ABC")
    .Select(sl => sl.DisplayName = "Testing").ToList();