在列表上使用带有foreach Action的条件lambda语句

Ale*_*lex 5 c# lambda

为什么我不能做这样的事情?

如果我有一个List<String> myList填充项目,我希望能够以条件方式对每个成员采取行动,如下所示:

myList.ForEach(a => { if (a.Trim().Length == 0) a = "0.0"; })
Run Code Online (Sandbox Code Playgroud)

但这不会编译.我猜它与缺少一个返回值有什么关系?

我试图准备一个字符串列表转换为双打,我希望空项目显示'0.0'所以我可以一次性转换整个列表.

ang*_*son 6

ForEach不可变,它不会以任何方式改变数据结构.

你可以:

  1. 使用索引自己处理循环
  2. 使用.Select和.ToList生成一个新列表(假设您使用的是.NET 3.5)

#1的示例:

for (Int32 index = 0; index < myList.Count; index++)
    if (myList[index].Trim().Length == 0)
        myList[index] = "0.0";
Run Code Online (Sandbox Code Playgroud)

使用.NET 3.5和Linq:

myList = (from a in myList
          select (a.Trim().Length == 0) ? "0.0" : a).ToList();
Run Code Online (Sandbox Code Playgroud)

使用.NET 3.5,不使用Linq语法,而是使用Linq代码:

myList = myList.Select(a => (a.Trim().Length == 0) ? "0.0" : a).ToList();
Run Code Online (Sandbox Code Playgroud)

编辑:如果您想要生成一个新的双打列表,您也可以使用Linq一次性完成:

List<Double> myDoubleList =
    (from a in myList
     select (a.Trim().Length == 0 ? "0" : a) into d
     select Double.Parse(d)).ToList();
Run Code Online (Sandbox Code Playgroud)

请注意,使用"0.0"而不是"0"依赖于小数点是句号.在我的系统上它不是,所以我用"0"替换它,但更合适的方法是将调用更改为Double.Parse以采用显式数字格式,如下所示:

List<Double> myDoubleList =
    (from a in myList
     select (a.Trim().Length == 0 ? "0.0" : a) into d
     select Double.Parse(d, CultureInfo.InvariantCulture)).ToList();
Run Code Online (Sandbox Code Playgroud)