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の方法が1つありますが、しないでください。LINQ はクエリ用であり、変更用ではありません。SortElementラムダに渡される参照型のため、構造体ではなくクラスである場合にのみ機能するはずです。

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

上記は、結果を に代入しなくても機能しsortsます。しかし、それは避けるべきです。

于 2013-09-24T17:22:03.207 に答える
0

これは、インプレース更新を使用して達成できます-SelectそしてToList結合します。

Selectフィルタリングされたリストを目的の値に変更し、遅延ToList評価のために選択をすぐに評価するために実行します-

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