gpt4 book ai didi

c# - 将 IEnumerable 强制转换为 IList 是否会枚举序列,为什么首选这种方式?

转载 作者:行者123 更新时间:2023-11-30 16:10:26 24 4
gpt4 key购买 nike

在来自 dotPeek 的一些反编译源中,我在 FirstOrDefault() 的主体中发现了这个有趣的片段,它是在快速验证检查后定义的:

  IList<TSource> list = source as IList<TSource>;
if (list != null)
{
if (list.Count > 0)
return list[0];
}
else
{
using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
if (enumerator.MoveNext())
return enumerator.Current;
}
}

我发现其中有两个好奇之处。

首先,这会列举来源吗?很显然,.Count 属性是为 IList 定义的,但是如果底层序列本身恰好是惰性的呢?

其次,如果它确实列举了来源,为什么这会是一个选择的实现?简单地使用 if() 检查之后的代码不是更有意义吗?

最佳答案

你是完全正确的,理论上,一个“惰性”序列可以实现IList<T> ,导致 Count属性访问不必要地枚举整个序列,只是为了丢弃生成的项目。在这种情况下,FirstOrDefault 选择的“优化”实际上会使事情变得更糟。

但在实践中,只有序列是可以通过索引提供对项目的快速访问的集合,通常才有望实现IList<T>。 .这就是为什么,例如 LinkedList<T>不实现此接口(interface),即使它可以提供它所需的所有功能。

也就是说,这个 FirstOrDefault 优化对于列表来说并不是真正的性能提升。充其量,它可以防止在堆上分配枚举器对象。不执行此优化不会是世界末日。

关于c# - 将 IEnumerable 强制转换为 IList<TResult> 是否会枚举序列,为什么首选这种方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25801398/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com