我有一个IEnumerable
列表,IEnumerable<SortElement>
排序;
我正在更新其财产:
sorts.Where(a => a.DisplayName.ToLower() == "abc")
.ToList()
.ForEach(sl => sl.DisplayName = "Testing");
但它不会改变该特定元素的属性。
答案 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)
您可以使用就地更新 - Select
和ToList
来实现此目标。
在Select
中将已过滤的列表更改为所需的值并执行ToList
以便由于延迟评估而立即评估选择 -
sorts.Where(a => a.DisplayName.ToUpper() == "ABC")
.Select(sl => sl.DisplayName = "Testing").ToList();