【发布时间】:2017-11-16 15:54:43
【问题描述】:
我有一个包含 1,000,000 个复杂对象的列表。我需要使用这些对象的子集创建另一个列表,保持原始列表不变。在代码的这一点上,我确定 bigList 不为空,并且它至少有 1 个项目。
我的原始代码:
var smallList = bigList.Where(csvrec => csvrec.PreApprovalAmount <= 0 || csvrec.PreApprovalAmount > csvrec.ReplacementAmount).ToList();
我的团队负责人说我的代码有几个问题。他说 .Where 可能会导致 null,调用 .ToList() 会导致 null 异常。因此,为了避免这种情况,他说我需要将代码更改为:
var smallList = new List<CSVLines>();
if(bigList.Any(csvrec => csvrec.PreApprovalAmount <= 0 || csvrec.PreApprovalAmount > csvrec.ReplacementAmount))
{
smallList = bigList.Where(csvrec => csvrec.PreApprovalAmount <= 0 || csvrec.PreApprovalAmount > csvrec.ReplacementAmount).ToList();
}
- 我不认为 .Where 会导致 null 异常。
- 我认为 smallList 永远不会为空。它可能是一个 包含 0 个元素但不为空的列表。
- 使用谓词执行 .Any 意味着它必须生成列表,然后 确定它是否至少有 1 个元素,然后我的代码将有 再次生成相同的列表以将其分配给 smallList。
我说的对吗?我的团队负责人提议的更改是否基本上使创建此列表的工作量增加了一倍,而没有真正的好处?
【问题讨论】:
-
首先,
bigList是什么? -
bigList 是一个 List
,它只是一个具有大约 50 个属性的对象。 -
Where永远不会产生 null 作为输出(如果源集合为 null,它会抛出NullReferenceException),只有空的 IEnumerable,如果调用Tolist,它将转换为空列表 -
您的团队负责人不正确,您的原始代码良好。
-
Where() 应该可以工作。
ToList()在较大的物体上可能不是一个好主意。尽量使用IEnumerable并限制您对列表的使用。
标签: c# .net performance linq-to-objects