StackOverflowのここでの応答の1つで、昨日コードスニペットを見て興味をそそられました。次のようなものでした:
List<string> myList = new List<string> {"aBc", "HELLO", "GoodBye"};
myList.ForEach(d=>d.ToLower());
MyListのすべての項目を小文字に変換するために使用できることを望んでいました。しかし、それは起こりません...これを実行した後、myListの大文字小文字は変更されません。
だから私の質問は、IS方法があるかどうか、LINQとLambdaの式を使用して、これに似た方法でリストの内容を簡単に反復および変更することです。
ありがとう、マックス
最も簡単なアプローチ:
myList = myList.ConvertAll(d => d.ToLower());
サンプルコードとそれほど違いはありません。 ForEach
は元のリストをループしますが、ConvertAll
は新しいリストを作成し、再割り当てする必要があります。
これは、ToLower returnsが元の文字列を変換するのではなく、小文字の文字列だからです。したがって、次のようなものが必要です。
List<string> lowerCase = myList.Select(x => x.ToLower()).ToList();
[TestMethod]
public void LinqStringTest()
{
List<string> myList = new List<string> { "aBc", "HELLO", "GoodBye" };
myList = (from s in myList select s.ToLower()).ToList();
Assert.AreEqual(myList[0], "abc");
Assert.AreEqual(myList[1], "hello");
Assert.AreEqual(myList[2], "goodbye");
}
ForEach
はAction<T>
を使用します。これは、不変でなければx
に影響を与える可能性があることを意味します。 x
はstring
であるため、不変であるため、ラムダでそれを実行してもプロパティは変更されません。 Kyralessaのソリューションは、置換値を返すことができる独自の拡張メソッドを実装する場合を除き、最適なオプションです。