8

文字列のリストが入力された次の汎用リストがあります。

List<string> mylist =new List<string>();  
myList.add("string1");  
myList.add("string2");

各文字列の最後に「test」を追加したいのですが、どうすれば簡単に実行できますか? 直感的に、私はこれを試してみましたが、これは問題なくコンパイルされます:

myList.ForEach(s => s = s + "test");  

しかし、リストの内容を見ると、何も変わっていません。forループを使用してリストを反復処理できると思いますが、非常に単純なものを探しており、ForEachを使用すると非常にきれいに見えます....しかし、うまくいかないようです。何か案は?

4

2 に答える 2

15

問題は、Action指定したがリストの要素で実行されることですが、結果はどこにも戻されません...あなたsはローカル変数のみです。

リストをその場で変更すると、おそらく実際のforeach.

list = list.ConvertAll(s => s + "test");

まったく同じではありません...しかし、できる限り近く...

于 2009-06-07T11:13:25.650 に答える
9

リスト型が変更可能な参照型でない限り、これを行うことはできません (その場合、リスト内の実際の参照を変更することはできませんが、オブジェクト自体は変更できません)。

その理由は、署名付きのデリゲートをList<T>.ForEach呼び出すためです。Action<T>

delegate void Action<T>(T obj);

ここでは、引数は値で渡されます(そうではありませんref)。他のメソッドと同様に、値によって呼び出されたときに入力引数を変更することはできません。

コードは基本的に次と同等です。

void anonymous_method(string s) {
    s = s + "test";  // no way to change the original `s` inside this method.
}

list.ForEach(anonymous_method);
于 2009-06-07T11:07:53.650 に答える