【问题标题】:c# Foreach vs Linq looping? [closed]c# Foreach vs Linq 循环? [关闭]
【发布时间】:2014-09-05 14:37:30
【问题描述】:

Foreach 循环和 LINQ 循环的主要区别是什么?

哪一种性能更好,它们有什么缺点。

我有两个产生相同结果的不同示例:

foreach(var countryItem in input.availableCountries) {
    var ddlItem = new ListItem();
    ddlItem.Text = countryItem.Value;
    ddlItem.Value = countryItem.Key;
    ddlNationalityCountry.Items.Add(ddlItem);
}

ddlNationalityCountry.Items.AddRange(input.availableCountries.Select(
    item => new ListItem { 
        Text = item.Value,
        Value = item.Key
    }).ToArray());

我应该使用哪一个?

【问题讨论】:

  • 你觉得 linq 用什么?
  • 如果您想知道哪个更快,请尝试两种方法并找出答案。至于您应该使用哪个版本 - 您认为最易读且易于维护的版本。
  • 您做了哪些研究和测试来调查这两者在做什么以及它们有何不同?这其中,你了解了什么,不了解什么?
  • 我知道 linq 使用相同的 foreach,但出于某种原因,它们都存在。我想知道主要区别,也许还有一些关于它们的棘手问题。
  • 在这种情况下,不会有太大的不同。您可以编写测试代码来查看哪个实际上更快,但我怀疑任何差异都会显着。 Linq 并不神奇,无法避免访问列表中的每个项目,因此两者都将是O(n)。至于为什么它们都存在,Linq 为您提供了不同且更具表现力的语法。同样,在这种情况下,它并没有太大的区别,但在更复杂的情况下,编写 linq 比编写充满大量条件检查的 foreach 更简洁。

标签: c# asp.net .net performance linq


【解决方案1】:

linq 运算符有少量开销。通常,此开销不会推动应用程序的性能。此外,开销使您能够更轻松地在其他地方创造效率。

其中一些效率是针对程序员的:更简洁的代码、更少的错误、更易于维护。一些效率在于更容易构建更快的算法。

我的意思是您的第一个示例是将项目添加到集合中。您的第二个示例正在生成一个数组。你为什么要创建那个数组?我知道函数调用需要它,但在大多数其他情况下,你不会。 Linq 允许您根据集合的管道进行思考,其中最终结果在最后一步之前永远不会完全实现,并且沿途的每一步仅作用于那些相关的元素,因此通常会节省很多 比 linq 开销更多的计算机时间或内存。

如果您只使用 linq 编写与 foreach 相同的内容,则 linq 将是(很小的!)净性能损失(但可能仍然是净生产力的胜利)。如果您学会接受 linq 可以做什么,那么 linq 可以在净性能上取得巨大的胜利。

【讨论】:

  • foreach 和 linq 语句的主要区别在于一个类似于 PASCAL,另一个类似于 HASKELL... :)
  • @Alexander:两者都在 C# 中占有一席之地,foreach 如果您想修改、添加、删除某些内容更合适,如果您想查询某些内容,则 LINQ 更具可读性(就读一些东西)。在这种情况下,OP 已经具备了将其添加到DropDownList:input.availableCountries 所需的一切。所以不需要使用 LINQ。
  • @TimSchmelter: a foreach is more appropriate if you want to modify,add,delete something: 只有你不能在你正在迭代的集合中添加或删除。
  • @MattBurland:something 是指别的东西。在这种情况下,DropDownListItems
  • @MattBurland 首先,这在技术上是不正确的。当集合被修改时,一些集合显式地破坏了它们的迭代器。许多人没有。有些甚至可以在被变异的同时迭代时正常工作。此外,对于有这种行为的人,您仍然可以在不迭代集合时修改集合,而是进行其他操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
相关资源
最近更新 更多