gpt4 book ai didi

c# - 获取 IEnumerable 的第一项并将其余项作为 IEnumerable 返回,仅迭代一次

转载 作者:行者123 更新时间:2023-11-30 22:51:28 24 4
gpt4 key购买 nike

我有一个枚举数,其中包含来自逐渐进入的服务调用的响应。

  • 我不能对可枚举对象执行 ToList,因为那样会阻塞,直到收到所有响应,而不是在响应出现时列出它们。
  • 我也不能迭代两次,因为那会触发另一个服务调用。

如何获取可枚举中的第一个元素并返回可枚举的延续?我无法使用迭代器方法,因为出现编译错误:

Iterators cannot have ref, in or out parameters.

我试过这段代码:

public IEnumerable<object> GetFirstAndRemainder(IEnumerable<object> enumerable, out object first)
{
first = enumerable.Take(1).FirstOrDefault();
return enumerable.Skip(1); // Second interation - unexceptable
}


// This one has a compilation error: Iterators cannot have ref, in or out parameters
public IEnumerable<object> GetFirstAndRemainder2(IEnumerable<object> enumerable, out object first)
{
var enumerator = enumerable.GetEnumerator();
enumerator.MoveNext();
first = enumerator.Current;
while (enumerator.MoveNext())
{
yield return enumerator.Current;
}
}

最佳答案

而不是使用 out参数,可以使用ValueTuple<T1, T2> (从 C# 7.0 开始,记录为 here )返回两个元素:IEnumerable<T> 的第一项。 ,其余为另一个IEnumerable<T> .

using System.Linq;

class Program {
static void Main(string[] args) {
(int first, IEnumerable<int> remainder) = GetFirstAndRemainder(Enumerable.Range(1, 5));
// first = 1
// remainder yields (2, 3, 4, 5)
}

// Returns the first item and the remainders as an IEnumerable
static (T, IEnumerable<T>) GetFirstAndRemainder<T>(IEnumerable<T> sequence) {
var enumerator = sequence.GetEnumerator();
enumerator.MoveNext();
return (enumerator.Current, enumerator.AsEnumerable());
}
}

您还需要从 IEnumerator 进行转换到IEnumerable我用扩展方法做了:

static class Extensions {
public static IEnumerable<T> AsEnumerable<T>(this IEnumerator<T> enumerator) {
while (enumerator.MoveNext()) {
yield return enumerator.Current;
}
}
}

请注意,根据您的要求,迭代一次 remainder即使它的类型为 IEnumerable<T> 也会耗尽它.

关于c# - 获取 IEnumerable 的第一项并将其余项作为 IEnumerable 返回,仅迭代一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59161472/

24 4 0