通常,当我处理 LINQ 序列时,我希望将每个项目发送到返回 void 的方法,从而避免 foreach 循环。但是,我还没有找到一种优雅的方法来做到这一点。今天,我写了如下代码:
private StreamWriter _sw;
private void streamToFile(List<ErrorEntry> errors)
{
if (_sw == null)
{
_sw = new StreamWriter(Path.Combine
(Path.GetDirectoryName(_targetDatabasePath), "errors.txt"));
}
Func<ErrorEntry, bool> writeSelector =
(e) => { _sw.WriteLine(getTabDelimititedLine(e)); return true; };
errors.Select(writeSelector);
_sw.Flush();
}
正如您所看到的,我编写了一个仅返回 true 的 lambda 函数,并且我意识到 Select 方法将返回一个布尔值序列 - 我将忽略该序列。然而,这似乎有点新手和卡顿。有什么优雅的方法可以做到这一点吗?或者我只是误用了 LINQ?
Thanks.
首先,您当前的代码将无法工作。
Select
和大多数其他 LINQ 方法都使用延迟执行,这意味着它们在枚举结果之前实际上不会执行任何操作。
一般来说,您永远不应该在 LINQ 查询中使用具有副作用的 lambda。
要回答您的问题,您应该使用foreach
loop.
您正在寻找一个ForEach
扩展方法;埃里克·利珀特 (Eric Lippert) 解释了为什么微软不写一个 https://ericlippert.com/2009/05/18/foreach-vs-foreach/.
如果你真的愿意,你可以自己写一个:
public static void ForEach<T>(this IEnumerable<T> sequence, Action<T> action) {
if (sequence == null) throw new ArgumentNullException("sequence");
if (action == null) throw new ArgumentNullException("action");
foreach(T item in sequence)
action(item);
}
//Return false to stop the loop
public static void ForEach<T>(this IEnumerable<T> sequence, Func<T, bool> action) {
if (sequence == null) throw new ArgumentNullException("sequence");
if (action == null) throw new ArgumentNullException("action");
foreach(T item in sequence)
if (!action(item))
return;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)