是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中显示。然后循环遍历这些相同的对象以检查是否出现字符串。
谢谢。
这在很大程度上取决于你想做什么。例如,如果你使用FirstOrDefault(p => ....)
, yield方法可以更快,因为它不需要将所有的东西存储到一个列表中,如果第一个元素是正确的,列表方法有一些开销(当然yield方法也有开销,但正如我所说的,这取决于)。
如果你想在数据上反复迭代,那么你应该使用列表
这取决于很多事情。
以下是使用IEnumerable<T>
而不是List<T>
的一些原因:
- 当你迭代集合的部分时(例如使用
FirstOrDefault
,Any
,Take
等) - 当你有一个大的集合,你可以
ToList()
它(例如斐波那契数列)。
当你不应该使用IEnumerable<T>
而不是List<T>
时:
- 当你想多次迭代整个集合时,不需要每次都创建迭代器。
当你在不同的条件下枚举一个DB查询多次时(你可能希望结果在内存中)。