我需要遍历一个列表,并有条件地针对集合中的每个项设置一个数据项:
使用标准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;
}所以我的问题是,它们到底有什么不同?有没有什么比其他的有明显的优势?
发布于 2011-01-20 17:43:41
好的,你可以从=>版本中去掉"Select(item lambda 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)
{
...
}但是,这实际上不会改变所发生的事情。
https://stackoverflow.com/questions/4745481
复制相似问题