【问题标题】:how to modify items in a Generic List using foreach?如何使用 foreach 修改通用列表中的项目?
【发布时间】:2009-06-07 11:03:39
【问题描述】:

我有以下用字符串列表填充的通用列表:

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

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

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

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

【问题讨论】:

    标签: c# foreach generic-list


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      除非列表类型是可变引用类型,否则这是不可能的(在这种情况下,您仍然不能更改列表中的实际引用,只能更改对象本身)。

      原因是List&lt;T&gt;.ForEach调用了Action&lt;T&gt;带签名的委托:

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

      【讨论】:

      • 感谢您的解释。非常有用。
      • 我也感谢你的解释......这是我见过的最简单的直截了当的解释......胜过 MSDN 上的任何东西。塔。
      • 是的,我喜欢这个答案,更简洁直观
      猜你喜欢
      • 2012-06-23
      • 2023-01-12
      • 1970-01-01
      • 2022-11-08
      • 1970-01-01
      • 1970-01-01
      • 2015-01-31
      • 2020-11-04
      • 1970-01-01
      相关资源
      最近更新 更多