8

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

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

假设我想在每个字符串的末尾添加“测试”,我怎样才能以简单的方式做到这一点?直观地,我尝试了这个编译好的:

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

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

4

2 回答 2

15

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

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

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

不完全一样...但尽可能接近...

于 2009-06-07T11:13:25.650 回答
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);
于 2009-06-07T11:07:53.650 回答