C# 写入记录器或控制台时将foreach转换为LINQ
给定以下一段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(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);
}
}