【问题标题】:Is the IEnumerable<T> function with a yield more efficient than the List<T> function?具有收益率的 IEnumerable<T> 函数是否比 List<T> 函数更有效?
【发布时间】:2015-10-08 13:29:15
【问题描述】:

我正在编写一个 C# 表单应用程序,想知道以下两个函数是否达到相同的结果:

public List<object> Method1(int parentId)
{
    List<object> allChildren = new List<object>();
    foreach (var item in list.Where(c => c.parentHtmlNodeForeignKey == parentId))
    {
        allChildren.Add(item);
        allChildren.AddRange(Method1(item.id));
    }
    return allChildren;
}
public IEnumerable<object> Method2(int parentId)
{
    foreach (var item in list.Where(c => c.parentHtmlNodeForeignKey == parentId))
    {
        yield return item;
        foreach (var itemy in Method2(item.id))
        {
            yield return itemy;
        }
    }
}

我是否正确地说Method1 函数比Method2 更有效?

另外,是否可以将上述任一函数编码得更高效?

编辑

我正在使用该函数返回一些对象,然后将这些对象显示在 ListView 中。然后我遍历这些相同的对象以检查是否出现字符串。

谢谢。

【问题讨论】:

  • 所有这些长名字很难阅读。 Method1Method2 怎么了?
  • 它们是如何被使用的?您是否多次迭代结果?您是否正在遍历所有的结果?
  • 这取决于您如何使用该功能。 Yield 函数是按需执行的,因此对该函数的单次调用所需的运行时间比 List 函数要少(但您不会得到结果)。 Yield 函数需要构造迭代器对象的开销。所以如果你在 Yield 方法的结果上调用ToList(),这可能比纯的List 函数要慢。
  • 公开List vs IEnumerable 从来都不是效率问题,更多的是意图。如果您打算让某人拿走您的物品并从中添加或删除,List 是您的最佳选择。如果您只想让某人对其进行迭代,IEnumerable 就是为此的合同。
  • When NOT to use yield (return) 的可能重复项

标签: c# list ienumerable


【解决方案1】:

这在很大程度上取决于您想要做什么。例如,如果您使用FirstOrDefault(p =&gt; ....),yield 方法会更快,因为不需要将所有内容存储到列表中,并且如果第一个元素是正确的,则列表方法有一些开销(当然,yield 方法也有开销但正如我所说,这取决于)。

如果您想一遍又一遍地迭代数据,那么您应该使用列表。

【讨论】:

  • 更不用说每次到达边界时的容量调整大小
【解决方案2】:

这取决于很多事情。

以下是使用IEnumerable&lt;T&gt; 而不是List&lt;T&gt; 的一些原因:

  1. 当您迭代集合的部分时(例如,使用FirstOrDefaultAnyTake 等)。
  2. 如果您有一个大型集合并且您可以ToList()它(例如斐波那契数列)。

当你不应该使用IEnumerable&lt;T&gt; 而不是List&lt;T&gt;

  1. 当您在不同条件下多次 枚举数据库查询时(您可能希望将结果存储在内存中)。
  2. 当您想要多次迭代整个集合时 - 无需每次都创建迭代器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多