IEnumerable <t>函数的yield是否比List <t>函数更高效?

时间:2015-07-19 08:30:04

标签: c# list ienumerable

我正在编写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中显示的对象。然后我循环遍历这些相同的对象以检查字符串是否出现。

感谢。

2 个答案:

答案 0 :(得分:3)

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

如果你想反复遍历数据,那么你应该使用列表。

答案 1 :(得分:1)

这取决于很多事情。

以下是使用IEnumerable<T>而不是List<T>的一些原因:

  1. 当您迭代集合的部分时(例如,使用FirstOrDefaultAnyTake等。)。
  2. 如果你有一个集合,你可以ToList()(例如Fibonacci系列)。
  3. 如果您不应使用IEnumerable<T>而不是List<T>

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