鉴于以下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);
}
答案 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。