我需要遍历列表,并有条件地针对集合中的每个项目设置数据项:
使用标准的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;
}
所以我的问题确实是,他们有多么不同?任何提供优势超过任何其他优势吗?
答案 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)
{
...
}
但同样不会真正改变发生的事情。