どのようにしますforeachを使用してジェネリックリスト内の項目を変更するには?

StackOverflow https://stackoverflow.com/questions/961705

  •  12-09-2019
  •  | 
  •  

質問

私は、文字列のリストが取り込まれ、次の一般的なリストを持っています

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

私は簡単な方法でそれを行うことができますどのように、私は各文字列の末尾に「テスト」を追加したいと?直感的に、私は大丈夫コンパイルされ、これを試してみました。

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

しかし、私は、リストの内容を見れば、何も変わっていません。私はリストを反復処理するループに使用することができると思いますが、私は非常にシンプルなものを探しているとのForEachを使用すると、非常にきれいに見えます....しかし、動作していないようです。任意のアイデア?

役に立ちましたか?

解決

問題は...あなたのActionはローカル変数だけます。

で指定したsは、リストの要素に対して実行されますが、結果はどこにも戻されないということです

その場でリストを変更すると、おそらく実際のforeachがかかりますが、あなたは結果として新しいリストを取るために満足している場合、あなたは試みることができる:

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

未全く同じ...しかし、あなたは...

買ってあげるほど近いです

他のヒント

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

理由は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);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top