通过列表进行迭代并有条件地设置成员 - 方法比较

时间:2011-01-20 09:40:08

标签: c# linq lambda iteration

我需要遍历列表,并有条件地针对集合中的每个项目设置数据项:

使用标准的foreach迭代器,这很简单:

//standard iteration
foreach (LogFileDataItem lfd in logFileData)
{
    if (lfd.FileName.Equals(currentLine, StringComparison.OrdinalIgnoreCase))
    {
        lfd.SQLScriptExecuted = true;
    }
}

但它让我觉得这是探索LINQ的理想机会,所以我重构到上面:

foreach (LogFileDataItem lfd in 
         from logFileDataItem in logFileData
         where logFileDataItem.FileName.Equals(currentLine, StringComparison.OrdinalIgnoreCase)
         select logFileDataItem)
{
    lfd.SQLScriptExecuted = true;
}

当然可以将其重构为lambda表达式:

foreach (LogFileDataItem lfd in logFileData.Where(item => item.FileName.Equals(currentLine, StringComparison.OrdinalIgnoreCase))
                                           .Select(item => item))
{
    lfd.SQLScriptExecuted = true;
}

所以我的问题确实是,他们有多么不同?任何提供优势超过任何其他优势吗?

1 个答案:

答案 0 :(得分:3)

好吧,你可以摆脱lambda版本中的“Select(item => item)”位(事实上C#编译器就是这样):

foreach (LogFileDataItem lfd in logFileData.Where(item => 
    item.FileName.Equals(currentLine, StringComparison.OrdinalIgnoreCase))

但基本上,是的 - 他们都在做同样的事情。我会考虑从foreach循环中分离出查询:

var relevantLogItems = logFileData.Where(...);
foreach (var lfd in relevantLogItems)
{
    ...
}

但同样不会真正改变发生的事情。