2

我有一个IEnumerable清单,IEnumerable<SortElement>排序;

我将其属性更新为:

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

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

4

3 回答 3

6

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

我会做这样的事情:

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

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

于 2013-09-24T17:21:28.983 回答
3

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. 但应该避免。

于 2013-09-24T17:22:03.207 回答
0

您可以使用就地更新来实现这一点 -SelectToList结合使用。

将过滤后的列表更改为Select所需的值,并ToList由于延迟评估而立即评估选择 -

sorts.Where(a => a.DisplayName.ToUpper() == "ABC")
    .Select(sl => sl.DisplayName = "Testing").ToList();
于 2013-09-24T17:30:43.173 回答