我有一个IEnumerable
清单,IEnumerable<SortElement>
排序;
我将其属性更新为:
sorts.Where(a => a.DisplayName.ToLower() == "abc")
.ToList()
.ForEach(sl => sl.DisplayName = "Testing");
但它不会更改该特定元素的属性。
我有一个IEnumerable
清单,IEnumerable<SortElement>
排序;
我将其属性更新为:
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";
}
}
或者
foreach (var item in
sorts.Where(r=> r.DisplayName.Equals("abc", StringComparison.InvariantCultureIgnoreCase)))
{
item.DisplayName = "Testing";
}
使用string.Equals重载进行不区分大小写的比较。
有一种纯粹的 LINQ 方法可以做到这一点,但请不要这样做。LINQ 用于查询,而不是用于修改。由于传递给 lambda 的引用类型,它应该只在SortElement
是一个类而不是结构时才有效。
sorts.Select(r => r.DisplayName.Equals("abc", StringComparison.InvariantCultureIgnoreCase)
? r.DisplayName = "Testing"
: r.DisplayName ).ToList();
即使没有将结果分配回sorts
. 但应该避免。
您可以使用就地更新来实现这一点 -Select
并ToList
结合使用。
将过滤后的列表更改为Select
所需的值,并ToList
由于延迟评估而立即评估选择 -
sorts.Where(a => a.DisplayName.ToUpper() == "ABC")
.Select(sl => sl.DisplayName = "Testing").ToList();