c# – 将LINQ序列中的项发送到返回void的方法

当我处理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;
}

相关文章

在项目中使用SharpZipLib压缩文件夹的时候,遇到如果目录较深,则压缩包中的文件夹同样比较深的问题。比...
项目需要,几十万张照片需要计算出每个照片的特征值(调用C++编写的DLL)。 业务流程:选择照片...
var array = new byte[4]; var i = Encoding.UTF8.GetBytes(100.ToString(&quot;x2&quot;));//...
其实很简单,因为Combox的Item是一个K/V的object,那么就可以把它的items转换成IEnumerable&lt;Dic...
把.net4.6安装包打包进安装程序。 关键脚本如下: 头部引用字符串对比库 !include &quot;WordFunc....
项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.NetʿreeSp...