【发布时间】:2015-07-02 18:01:33
【问题描述】:
当前代码:
对于MapEntryTable 中的每个元素,检查属性IsDisplayedColumn 和IsReturnColumn,如果它们为真则将该元素添加到另一组列表中,其运行时间为O(n),会有很多两个属性都为 false 的元素,因此不会被添加到循环中的任何列表中。
foreach (var mapEntry in MapEntryTable)
{
if (mapEntry.IsDisplayedColumn)
Type1.DisplayColumnId.Add(mapEntry.OutputColumnId);
if (mapEntry.IsReturnColumn)
Type1.ReturnColumnId.Add(mapEntry.OutputColumnId);
}
以下是执行相同操作的 Linq 版本:
MapEntryTable.Where(x => x.IsDisplayedColumn == true).ToList().ForEach(mapEntry => Type1.DisplayColumnId.Add(mapEntry.OutputColumnId));
MapEntryTable.Where(x => x.IsReturnColumn == true).ToList().ForEach(mapEntry => Type1.ReturnColumnId.Add(mapEntry.OutputColumnId));
我正在将所有这些 foreach 代码转换为 linq,因为我正在学习它,但我的问题是:
在这种情况下,我能从 Linq 转换中获得任何优势还是劣势?
有没有更好的方法使用 Linq 来做同样的事情
更新:
考虑在列表中的 1000 个元素中 80% 的两个属性都为 false 的情况,然后 where 为我提供了快速查找具有给定条件的元素的好处。
Type1 是一个自定义类型,具有一组 List<int> 结构、DisplayColumnId 和 ReturnColumnId
【问题讨论】:
-
如果你想缩短你的代码有点摆脱“== true”比较。如果 IsDisplayedColumn 为真,x => x.IsDisplayedColumn 将返回真,无需将其与实际值进行比较。您可能还不必要地调用 ToList()。
-
@Andrew B 第一部分是正确的,但第二部分是强制性的,Foreach 是一个列表扩展方法而不是 IEnumerable
-
list1和list2是什么类型?
-
我从未见过具有 DisplayColumnId 属性的 List
...我一定在这里遗漏了一些东西。无论如何,没有足够的信息来回答:当您可以使用 sequence.ToList()或list.AddRange(sequence)将序列分配或附加到列表时,您可能不需要ToList().ForEach()。 -
@MrinalKamboj 那么你的名字都非常具有误导性。当它们不是列表时,您不应该有名为
list1和list2的变量,并且名称DisplayColumnId听起来根本不像应该是一个集合,它的名称暗示它是一个单数标识符。