2009-06-07 64 views
8

我有填充了字符串列表下面的泛型列表:如何使用foreach修改通用列表中的項目?

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

說我要在每個字符串末尾添加「測試」,我怎麼能做到這一點以簡單的方式?直觀地說,我想這其中編譯OK:

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

但是,如果我再看看列表的內容,一切都沒有改變。我想我可以使用for循環遍歷列表,但我正在尋找一些非常簡單的東西,並且使用ForEach看起來非常整潔......但似乎不起作用。有任何想法嗎?

回答

14

的問題是Action指定有關的元素被執行該列表,但結果不會放回任何地方...您的s只是一個局部變量。

改變就地可能會採取實際foreach名單,但如果你是樂於接受新的列表作爲結果,你可以嘗試:

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

不太一樣......但就像你會得到...

+1

作爲替代IEnumerable 。選擇(S => S +「測試」)... – 2011-05-23 09:22:03

9

除非列表類型是可變引用類型(並且在這種情況下,您仍然無法更改列表中的實際引用,而是更改對象本身),否則不可能這樣做。

的原因是調用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); 
+0

感謝您的解釋。很有用。 – Anthony 2009-06-07 11:14:21

+1

我也非常感謝ye'的解釋......這是我見過的最簡單的straigth-up解釋......擊敗MSDN上的任何東西,並且一切都落實了。助教。 – corlettk 2009-06-07 12:05:16

+0

是的,我喜歡這個答案,更清潔和直觀 – Vincent 2014-11-21 01:16:01

相關問題