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

C# 如何在C中更新IEnumerable列表中特定元素的属性,c#,linq,ienumerable,C#,Linq,Ienumerable,我有一个IEnumerable列表,IEnumerable排序 我将其财产更新为: sorts.Where(a => a.DisplayName.ToLower() == "abc") .ToList() .ForEach(sl => sl.DisplayName = "Testing"); 但它不会更改该特定元素的属性。将ABC更改为ABC。你的条件永远不会满足。您也可以将.ToLower更改为.ToUpper 我会这样做: foreach(var e in so

我有一个IEnumerable列表,IEnumerable排序

我将其财产更新为:

sorts.Where(a => a.DisplayName.ToLower() == "abc")
    .ToList()
    .ForEach(sl => sl.DisplayName = "Testing");
但它不会更改该特定元素的属性。

将ABC更改为ABC。你的条件永远不会满足。您也可以将.ToLower更改为.ToUpper

我会这样做:

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

因为您的代码实际上执行了2个循环,所以这不是必需的。

LINQ更适合查询,它不是一个好的修改选项

您可以修改列表项,如:

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

在直观比较中使用重载进行大小写

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

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

即使不将结果重新分配给排序,上述方法也会起作用。但这应该避免

您可以同时使用就地更新选择和ToList来实现这一点

在“选择”中,将过滤列表更改为所需值,并执行ToList,以便由于延迟计算而立即计算“选择”-

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

SortElement是否为结构?这将创建一个新列表,其中仅包含从标准中选择的元素。OP正在原始列表中寻找修改。这确实会修改原始列表。你试过了吗?在“选择查询”中,我更新displayName,以防您错过它。您是对的。这将修改原始列表,因为引用稍后将被修改。但我一直是:。
sorts.Where(a => a.DisplayName.ToUpper() == "ABC")
    .Select(sl => sl.DisplayName = "Testing").ToList();