gpt4 book ai didi

c# - 为什么 DefaultIfEmpty 是这样实现的?

转载 作者:行者123 更新时间:2023-11-30 20:36:19 26 4
gpt4 key购买 nike

追踪 System.Linq.Enumerable.DefaultIfEmpty 的实现让我找到了这个方法。除了以下古怪的细节外,它看起来还不错:

// System.Linq.Enumerable
[IteratorStateMachine(typeof(Enumerable.<DefaultIfEmptyIterator>d__90<>))]
private static IEnumerable<TSource> DefaultIfEmptyIterator<TSource>(IEnumerable<TSource> source, TSource defaultValue)
{
using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
if (enumerator.MoveNext())
{
do
{
yield return enumerator.Current;
}
while (enumerator.MoveNext());
}
else
{
yield return defaultValue;
}
}
IEnumerator<TSource> enumerator = null;
yield break;
yield break;
}

1) 为什么一旦确定序列不为空,代码就必须遍历整个序列?

2) 为什么 yield 在最后两次突破?

3) 为什么在没有其他引用的情况下在末尾显式地将 enumerator 设置为 null?

我会把它留在这里:

// System.Linq.Enumerable
[IteratorStateMachine(typeof(Enumerable.<DefaultIfEmptyIterator>d__90<>))]
private static IEnumerable<TSource> DefaultIfEmptyIterator<TSource>(IEnumerable<TSource> source, TSource defaultValue)
{
using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
if (enumerator.MoveNext())
{
do
{
yield return enumerator.Current;
}
// while (enumerator.MoveNext());
}
else
{
yield return defaultValue;
}
}
// IEnumerator<TSource> enumerator = null;
yield break;
// yield break;
}

最佳答案

DefaultIfEmpty 需要如下操作:

  1. 如果源可枚举没有条目,它需要充当具有单个值的可枚举;默认值。

  2. 如果source enumerable不为空,则需要充当source enumerable。因此,它需要产生所有值。

关于c# - 为什么 DefaultIfEmpty 是这样实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37118278/

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