是否存在“;“更漂亮”;这样做的方法

本文关键字:这样做 方法 漂亮 存在 是否 更漂亮 | 更新日期: 2023-09-27 18:16:54

假设我有行

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

是否存在“;“更漂亮”;这样做的方法

我看不出简单循环有什么问题。老实说,我不知道为什么有些人痴迷于使用LINQ或他们最近发现的任何闪亮的新工具/语法结构,而最简单、最合乎逻辑的答案就在他们面前。

你的循环没有错;担心解决真正的问题。

您可以使用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);

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

如果它是我的代码,它可能是这样的:

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
   }
}

I使用ForEach来产生副作用,并且在LINQ查询中避免副作用这包括例外情况!我处理LINQ的大部分代码实际上都返回IList<T>,而不是IEnumerable<T>,以确保它在适当的上下文中是"强制的"。懒惰是好的,除非不是:C#不是Haskell。

快乐的编码。

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

我会怎么做。

相关文章: