将简单的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方法的调用中?

将简单的ForEach转换为Linq语句

我不建议尝试将其转换为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()