是IEnumerable函数的yield比List函数

本文关键字:函数 List yield IEnumerable | 更新日期: 2023-09-27 18:03:20

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

谢谢。

是IEnumerable<T>函数的yield比List<T>函数

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

如果你想在数据上反复迭代,那么你应该使用列表

这取决于很多事情。

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

  1. 当你迭代集合的部分时(例如使用FirstOrDefault, Any, Take等)
  2. 当你有一个大的集合,你可以ToList()它(例如斐波那契数列)。

当你不应该使用IEnumerable<T>而不是List<T>时:


    当你在不同的条件下枚举一个DB查询多次时(你可能希望结果在内存中)。
  1. 当你想多次迭代整个集合时,不需要每次都创建迭代器。