【发布时间】:2017-07-13 14:51:51
【问题描述】:
这是:
Box boxToFind = AllBoxes.FirstOrDefault(box => box.BoxNumber == boxToMatchTo.BagNumber);
比这更快或更慢:
Box boxToFind ;
foreach (Box box in AllBoxes)
{
if (box.BoxNumber == boxToMatchTo.BoxNumber)
{
boxToFind = box;
}
}
两者都给我我正在寻找的结果 (boxToFind)。这将在我需要注意性能的移动设备上运行。
【问题讨论】:
-
您的第一个方法无法编译。 Where 返回一个 IEnumerable。为了等同于最后一个,您必须执行 AllBoxes.Last(box => ...)
-
好点。我改变了我的第一种方法。 (虽然我没有使用 last,因为它“应该”只有唯一值)
-
您的第二种方法将编译,但会给您最后一个匹配的框。休息一下;当你退出 if 时。
-
编辑后,两者实际上并没有做同样的事情。一旦找到第一个匹配框,就应该跳出 foreach 循环。否则,您要么得到不同的结果,要么如果该框是唯一的,您会无缘无故地迭代其余项目,从而降低性能。
-
正如 Chris Taylor 所说,您自己的实现是“最后一个或默认”,而不是“第一个或默认”。
标签: c# linq performance