将简单的ForEach转换为Linq语句

时间:2013-04-15 12:01:58

标签: c# linq

我是一个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方法的调用?

3 个答案:

答案 0 :(得分:7)

我不建议尝试将其转换为Linq,因为Linq旨在用于函数式编程,而不是命令式。如果你想将它与SQL进行比较,那么它将没有DML。

Dts.Events.FireInformation似乎没有返回您可以选择的值。它可能会触发事件或其他内容,并且还使用ref参数。这段代码看起来根本不像是一个查询,我认为它不应该强制成一个。在这种情况下,foreach循环完全正常,因为您实际上在其中工作而不是查询数据(这是linq将用于的)。

如果您需要根据某些条件过滤集合,如果您需要加入单独的集合或类似的东西,那么Linq可能是一个更好的工具。

答案 1 :(得分:5)

通常,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是List,否则你不能这样做。 (无法从您的问题中判断出它是IEnumerable还是列表)

解决方法是创建扩展方法并使用它。像这样:

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

之后,您可以在源代码上使用ForEach方法,如示例所示。

答案 2 :(得分:2)

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