我正在努力解决传递给集成的问题。到目前为止,最好的方法是返回IAsyncEnumerable<IAsyncEnumerable<T>>而不是IAsyncEnumerable<T>,然后将其扁平化。我对此并不兴奋,所以我在这里寻求建议。
其基本目标是允许一个人从子方法中获取一部分IAsyncEnumerable,而不必发疯。下面的Counting()方法是我的尝试。
我认为设计递归对象以允许更深层次的嵌套不会有太大的麻烦。但我还是不太喜欢。
public static class AsyncEnumerables
{
public static async IAsyncEnumerable<T> Flatten<T>(IAsyncEnumerable<IAsyncEnumerable<T>> enumerables)
{
await foreach (var e in enumerables)
{
await foreach (var t in e)
{
yield return t;
}
}
}
public static async IAsyncEnumerable<T> Singleton<T>(T t)
{
await Task.CompletedTask;
yield return t;
}
}
public class AsyncEnumerableTests
{
public async IAsyncEnumerable<int> Children()
{
yield return 1;
await Task.Delay(1000);
yield return 2;
}
public async IAsyncEnumerable<IAsyncEnumerable<int>> Counting()
{
yield return AsyncEnumerables.Singleton(0);
await Task.Delay(100);
yield return Children();
yield return AsyncEnumerables.Singleton(3);
}
[Fact]
public async Task Counting_Counts()
{
var numbers = new List<int>();
await foreach (var n in AsyncEnumerables.Flatten(Counting())) {
numbers.Add(n);
}
Assert.Equal(4, numbers.Count);
for (int i=0; i<4; i++)
{
Assert.Equal(i, numbers[i]);
}
}
}发布于 2020-05-12 08:44:52
在设计API时,有几件事值得考虑,API应该返回IAsyncEnumerable<IAsyncEnumerable<T>>或返回IAsyncEnumerable<T>。
Timeouts。yield return语句之间进行自定义代码注入。yield returns之间插入自定义代码。如果您正在考虑提供一个扁平的API,那么我建议检查这个包,称为System.Interactive.Async。在这个包中有一个名为AsyncEnumerableEx的类,它定义了一个合并函数。
https://codereview.stackexchange.com/questions/241505
复制相似问题