どのようにしますforeachを使用してジェネリックリスト内の項目を変更するには?
-
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);
所属していません StackOverflow