如何使用foreach修改Generic List中的项?

8
我有一个以下类型的通用列表,其中填充了一组字符串:
```

我有以下泛型列表,其中填充了一组字符串:

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

假设我想在每个字符串的末尾添加“test”,有什么简单的方法可以实现吗?直觉告诉我可以尝试以下代码,它可以编译通过:

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

但是,如果我查看列表的内容,似乎没有改变。我想我可以使用for循环来迭代列表,但我正在寻找非常简单的东西,并且使用ForEach看起来非常整洁... 但似乎不起作用。有什么建议吗?

2个回答

15

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

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

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

不完全相同,但这是你能得到的最接近的了...


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);

1
我也感谢您的解释...那是我见过的最简单直接的解释...绝对比MSDN上的任何东西都要好。谢啦。 - corlettk
是的,我喜欢这个答案,更加简洁和直观。 - Vincent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接