将简单的ForEach转换为Linq语句
本文关键字:Linq 语句 转换 ForEach 简单 | 更新日期: 2023-09-27 18:09:18
我是一名SQL开发人员,所以Linq(通常是C#(对我来说有点陌生,尽管如此,我有一个简单的foreach
循环,我认为Linq查询可能会更好地为它服务。如果没有别的,这将是一件有用的事情,即使手头的问题不是特别困难。这是我的代码:
bool fireAgain = true;
foreach (var connMan in Dts.Connections)
{
Dts.Events.FireInformation
( 0
, ""
, String.Format("Connection Manager {0} has connection string {1}"
, connMan.Name
, connMan.ConnectionString)
, ""
, 0
, ref fireAgain
);
}
我可以算出:
from connMan in Dts.Connections select connMan
很容易,但我如何将connMan传递到对FireInformation方法的调用中?
我不建议尝试将其转换为Linq,因为Linq用于函数式编程,而不是命令式编程。如果您想将它与SQL进行比较,那么它将没有DML。
Dts.Events.FireInformation
似乎没有返回您可以选择的值。它可能会触发一个事件或其他什么,而且它还使用了一个ref
参数。这段代码看起来根本不像一个查询,我认为它不应该被强制为一个查询。在这种情况下,foreach
循环非常好,因为您实际上是在它内部进行工作,而不是查询数据(这就是linq的作用(。
如果你需要根据某些条件筛选集合,如果你需要加入单独的集合或类似的东西,那么Linq可能是一个更好的工具。
通常,LINQ将用于查询信息。在这种情况下,您也在查询信息。
然而,你可以做的是:
Dts.Connections.ForEach((conMan) =>
{
Dts.Events.FireInformation(0, "", String.Format("Connection Manager {0} has connection string {1}", connMan.Name, connMan.ConnectionString), "", 0, ref fireAgain);
}
也就是说,如果Dts.Connections是一个列表,否则就不能执行此操作。(无法从你的问题中判断它是IEnumerable还是List(
一个变通方法是创建一个扩展方法并无论如何使用它。像这样:
public void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
foreach(T item in source)
{
action(item);
}
}
之后,您可以在源代码上使用ForEach方法,如示例所示。
Dts.Connections
.ForEach(connMan => Dts.Events.FireInformation(0, "", String.Format("Connection Manager {0} has connection string {1}", connMan.Name, connMan.ConnectionString), "", 0, ref fireAgain));
如果Connections不是IEnumerable,请将第一行更改为;
Dts.Connections.ToList()