Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 写入记录器或控制台时将foreach转换为LINQ_C#_Linq - Fatal编程技术网

C# 写入记录器或控制台时将foreach转换为LINQ

C# 写入记录器或控制台时将foreach转换为LINQ,c#,linq,C#,Linq,给定以下一段foreach代码,如何将其作为LINQ编写 foreach(var error in ex.Errors) { Logger.Error("Field {0} has an error : {1}. for SSN {2}",error.FieldName, error.Message, error.SSN); } LINQ用于产生结果,例如新序列和聚合。它不适合产生副作用,例如日志输出 代码中的foreach循环是一个完全可以接受的、非常可读的解决方案。如果你想摆

给定以下一段foreach代码,如何将其作为LINQ编写

foreach(var error in ex.Errors)
{
   Logger.Error("Field {0} has an error : {1}. for SSN {2}",error.FieldName,    error.Message, error.SSN);
} 

LINQ用于产生结果,例如新序列和聚合。它不适合产生副作用,例如日志输出

代码中的
foreach
循环是一个完全可以接受的、非常可读的解决方案。如果你想摆脱它,你可以使用这个方法,它采取一个
动作


我个人不会这么做,但如果您真的想在这里使用LINQ,有两种选择:

ex.Errors.ForEach(error => Logger.Error("Field {0} has an error : {1}. for SSN {2}", error.FieldName, error.Message, error.SSN));


但是第二个问题有点取决于如何实现
Logger.Error,以及是否可以加入字符串。

您可以转换为list并使用

或者,编写自己的ForEach扩展方法:

public static void ForEach<T>(this IEnumerable<T> enumeration, Action<T> action)
{
    foreach(T item in enumeration)
    {
        action(item);
    }
}
publicstaticvoidforeach(此IEnumerable枚举,操作)
{
foreach(枚举中的T项)
{
行动(项目);
}
}

但是在这种情况下,最好不要使用Linq。

为什么要用Linq编写它?这里不需要Linq Linq不是为了副作用。这就是你已经拥有的循环。想知道作为LINQ写是否值得。从评论中我看不到。如果你真的想避免在这里使用
foreach
,你可以使用
列表。foreach(Action)
做同样的事情,它更模糊,虽然并不总是像使用专用的
foreach
循环那样清晰,但我以前也用过这个。
Logger.Error(string.Join(Environment.NewLine, 
    ex.Errors.Select(error => 
        string.Format("Field {0} has an error : {1}. for SSN {2}", error.FieldName, error.Message, error.SSN))));
ex.Errors.ToList().ForEach(error =>
{
    Logger.Error("Field {0} has an error : {1}. for SSN {2}", error.FieldName, error.Message, error.SSN);
});
public static void ForEach<T>(this IEnumerable<T> enumeration, Action<T> action)
{
    foreach(T item in enumeration)
    {
        action(item);
    }
}