103

昨日、StackOverflow の応答の 1 つでコード スニペットを見て、興味をそそられました。それは次のようなものでした:

 List<string> myList = new List<string> {"aBc", "HELLO", "GoodBye"};

 myList.ForEach(d=>d.ToLower());

これを使用して、myList 内のすべての項目を小文字に変換できることを望んでいました。しかし、そうはなりません...これを実行した後、myList の大文字と小文字は変更されません。

だから私の質問は、LINQ と Lambda 式を使用して、これと同様の方法でリストの内容を簡単に反復処理して変更する方法があるかどうかです。

ありがとう、マックス

4

5 に答える 5

201

最も簡単なアプローチ:

myList = myList.ConvertAll(d => d.ToLower());

サンプルコードとあまり変わらない。ForEach元のリストをループしConvertAllますが、再割り当てが必要な新しいリストを作成します。

于 2008-10-23T19:05:41.130 に答える
52

これは、ToLowerが元の文字列を変換するのではなく、小文字の文字列を返すためです。したがって、次のようなものが必要です。

List<string> lowerCase = myList.Select(x => x.ToLower()).ToList();
于 2008-10-23T19:00:56.443 に答える
4

ForEachこれは、不変でない場合にAction<T>影響を与える可能性があることを意味します。は であるxため、不変であるため、ラムダで何をしてもそのプロパティは変更されません。置換値を返すことができる独自の拡張メソッドを実装する場合を除き、Kyralessa のソリューションが最適なオプションです。xstring

于 2008-10-23T19:05:23.657 に答える
3
[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");
}
于 2008-10-23T19:00:17.100 に答える
-1
var _reps = new List(); // with variant data

_reps.ConvertAll<string>(new Converter<string,string>(delegate(string str){str = str.ToLower(); return str;})).Contains("invisible"))
于 2013-03-07T08:13:02.490 に答える