2009-06-07 7 views
8

私は、文字列のリストが取り込まれ、次の一般的なリストがあります。foreachを使用して汎用リストの項目を変更する方法は?

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

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

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

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

答えて

14

問題は、あなたが指定したActionはの要素上で実行されることを示します。

をコードは、本質的に同等ですリストは返されますが、結果はどこにも戻されません。sはローカル変数のみです。インプレースのリストを変更する

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

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

かなり同じではありません...しかし、あなたが手に入れるほど近づいてください...

+1

別名IEnumerable .Select(s => s + "test")... –

9

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

delegate void Action<T>(T obj); 

、ここで、引数があるで渡さ:

理由はは、署名付きAction<T>デリゲートを呼び出すことです。いずれかの方法のように、それが価値で呼ばれていたときに入力引数を変更することはできません。

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

list.ForEach(anonymous_method); 
+0

ありがとうございます。非常に便利。 – Anthony

+1

私はあなたの説明にも感謝しています...それは私が見た最も簡単な説明です...何かMSDNのすべてのものを打ち負かす。 Ta。 – corlettk

+0

はい、私はこの回答が好きで、よりクリーンで直感的です – Vincent

関連する問題