如何使用foreach修改通用列表中的项目?

时间:2009-06-07 11:03:40

标签: c# foreach generic-list

我有以下通用列表,其中填充了一个字符串列表:

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

假设我想在每个字符串的末尾添加'test',我该怎样才能以简单的方式完成?直觉上,我试过这个编译好了:

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

但是,如果我再看一下List的内容,一切都没有改变。我想我可以使用for循环迭代List但我正在寻找一些非常简单的东西,使用ForEach看起来非常整洁....但似乎不起作用。有什么想法吗?

2 个答案:

答案 0 :(得分:14)

问题是你指定的Action会在列表的元素上执行,但结果不会放回任何地方......你的s只是一个局部变量。

就地更改列表可能需要实际foreach,但如果您乐意将新列表作为结果,则可以尝试:

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

不太一样......但是尽可能接近......

答案 1 :(得分: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);