说我有线
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);
}
答案 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));
将是我如何去做。