是否存在“;“更漂亮”;这样做的方法
本文关键字:这样做 方法 漂亮 存在 是否 更漂亮 | 更新日期: 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));
我会怎么做。