有没有“更漂亮”的方式来做到这一点?

时间:2011-12-06 23:55:37

标签: c# foreach

说我有线

dirs.ToList().ForEach(d => item.Items.Add(MyMethod(d)));

但是现在我想避免在方法返回null时添加到我的列表中。有没有比

更漂亮的方式
foreach(var d in dirs)
{
    object obj = MyMethod(d);
    if(obj != null)
        myList.Items.Add(obj);
}

4 个答案:

答案 0 :(得分:10)

我没有看到简单循环出了什么问题。老实说,我不知道为什么有些人迫切需要使用LINQ或他们最近发现的任何闪亮的新工具/句法结构,当最简单和最合乎逻辑的答案就在他们面前时。

你的循环没有错;担心解决实际问题。

答案 1 :(得分:3)

您可以使用Select()来呼叫MyMethod(),然后使用Where()过滤列表:

var filteredDirs = dirs.Select(MyMethod)
                       .Where(d => d != null);

如果item.Items支持AddRange()(或者如果您将其作为扩展方法编写),则可以执行以下操作:

item.Items.AddRange(filteredDirs);

如果它不支持它(并且你不想为它编写扩展方法),foreach可能是最好的:

foreach (var dir in filteredDirs)
    item.Items.Add(dir);

但正如其他人所说,像你发布的简单命令式代码没有任何问题。

答案 2 :(得分:2)

如果它是我的代码,这很可能是它的外观:

foreach(var name in dirs         // dunno if "name" is correct :)
      .Select(d => MyMethod(d))  // or .Select(MyMethod), depending
      .Where(n => n != null)) {
    myList.Items.Add(name);
}

如果支持AddRange:

myList.Items.AddRange(
  dirs.Select(d => MyMethod(d))
      .Where(n => n != null));

然而,我发现发布的foreach个案并不可怕,事实上: foreach { if ... } 非常理想

这是因为它可以简单地扩展foreach { if ... else ... }。 C#3.0 / 4.0没有非常友好的方式来处理分区列表,并且在订单导入的情况下,分区和然后分别处理列表的方法不是一个可行的解决方案。在这种情况下,我仍然通常(但并非总是)使用LINQ进行尽可能多的转换:

foreach(var name in dirs
      .Select(d => MyMethod(d))) {
   if (name != null) {
     myList.Items.Add(name);
   } else {
     SingMerrySongsAndDanceAHappyLittleJig(); // or ... whatever
   }
}

使用ForEach进行副作用,我避免在LINQ查询中出现副作用。这包括异常!我处理LINQ的大部分代码实际上返回IList<T>而不是IEnumerable<T>以确保它在适当的上下文中“被强制”。懒惰如果好,除非它不是:C#不是Haskell。

快乐的编码。

答案 3 :(得分:1)

dirs.Select(dir => MyMethod(dir))
    .Where(result => result != null)
    .ForEach(result => item.Items.Add(result));

将是我如何去做。