c# – 将LINQ序列中的项发送到返回void的方法
发布时间:2020-12-15 17:36:04 所属栏目:百科 来源:网络整理
导读:当我处理LINQ序列时,我想将每个项目发送到一个返回void的方法,避免了foreach循环.但是,我没有找到一个优雅的方式来做到这一点.今天我写了下面的代码: private StreamWriter _sw; private void streamToFile(ListErrorEntry errors) { if (_sw == null) { _s
当我处理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? 谢谢. 解决方法
首先,您当前的代码将无法正常工作.
选择和大多数其他LINQ方法都使用延迟执行,这意味着在枚举结果之前,它们实际上不会执行任何操作. 一般来说,您不应该在LINQ查询中使用带有副作用的lambda. 要回答你的问题,你应该使用foreach循环. 您正在寻找ForEach扩展方法; Eric Lippert explains why Microsoft didn’t write one. 如果你真的想,你可以自己写一个: 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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |