在写入Logger或Console时将foreach转换为LINQ

时间:2016-01-25 16:28:11

标签: 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);
} 

3 个答案:

答案 0 :(得分:3)

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

代码中的foreach循环是一个完全可以接受的,非常易读的解决方案。无论如何你想要摆脱它,你可以使用List.ForEach方法,它需要Action<T>

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

答案 1 :(得分:0)

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

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

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))));

但第二个问题略微取决于Logger.Error的实施方式以及加入字符串是否合适。

答案 2 :(得分:0)

您可以转换为列表并使用ForEach

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

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

public static void ForEach<T>(this IEnumerable<T> enumeration, Action<T> action)
{
    foreach(T item in enumeration)
    {
        action(item);
    }
}

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