2009-06-07 37 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

相关问题