C# 使用奇数和偶数合并2个数组,并通过任务操作显示为自然数
假设我们有两个异步方法C# 使用奇数和偶数合并2个数组,并通过任务操作显示为自然数,c#,task-parallel-library,c#-8.0,C#,Task Parallel Library,C# 8.0,假设我们有两个异步方法 public异步任务GetOddNumbers() { 返回新的int[]{1,3,5,7,9}; } public异步任务GetEvenNumbers() { 返回新的int[]{2,4,6,8,10}; } 我想将数组和显示组合为1,2,3,4,5,6,7,8,9,10 我们如何通过C#中的TAP(基于任务的异步模式)实现这一点? 请提供有价值的建议。您当前的实现不需要任何异步代码 我想这只是一个简化的示例,所以我将它们视为异步方法 static async T
public异步任务GetOddNumbers()
{
返回新的int[]{1,3,5,7,9};
}
public异步任务GetEvenNumbers()
{
返回新的int[]{2,4,6,8,10};
}
我想将数组和显示组合为1,2,3,4,5,6,7,8,9,10
我们如何通过C#中的TAP(基于任务的异步模式)实现这一点?
请提供有价值的建议。您当前的实现不需要任何异步代码 我想这只是一个简化的示例,所以我将它们视为异步方法
static async Task Main(字符串[]args)
{
var赔率=等待GetOddNumbers();
var evens=等待GetEvenNumbers();
变量数=(赔率).Zip(偶数)
.SelectMany(tuple=>new[]{tuple.First,tuple.Second});
Console.ReadLine();
}
Zip
)一个元素从赔率
组合到evens
中的另一个元素。因此,我们将得到以下结构(元组数组):[
(1,2),
(3,4),
(5,6),
(7,8),
(9,10),
]
SelectMany
。您可以通过第一个
属性访问左侧项目,通过第二个
属性访问右侧项目。3.1)如果您只调用
Select
而不调用SelectMany
,那么您将得到一个数组[
[1,2],
[3,4],
[5,6],
[7,8],
[9,10],
]
3.2)但是通过SelectMany
我们将数组的数组展平为一个简单的数组
[
1,2,3,4,5,6,7,8,9,10
]
更新:OP添加了一项新要求(作为注释),即应逐个异步检索数据 为了满足这个需求,我们需要使用
IAsyncEnumerable
。这使我们能够在数据可用时一次提供一个数据
供方
因此,我们不必返回任务
,而必须返回IAsyncEnumerable
。GetOddNumbers
和GetEvenNumbers
可以这样重写:
公共静态异步IAsyncEnumerable GetOddNumbers()
{
var赔率=新整数[]{1,3,5,7,9};
foreach(风险值奇数)
{
wait Task.Delay(1000);//任何异步方法调用
收益率奇数;
}
}
公共静态异步IAsyncEnumerable GetEvenNumbers()
{
var evens=新的int[]{2,4,6,8,10};
foreach(var偶数)
{
wait Task.Delay(1000);//任何异步方法调用
收益率均衡;
}
}
消费者方面
我们可以利用C#8的新wait foreach
关键字。IAsyncEnumerable没有内置的Zip
函数,因此我们需要使用自定义函数,如下所示:
有了这些工具,Main
方法如下所示:
static async Task Main(字符串[]args)
{
var tobeitrated=async_enumerable_dotnet.AsyncEnumerable.Zip(z=>z,GetOddNumbers(),GetEvenNumbers());
等待foreach(int[]oddEvenPair in to beitrated)
{
Console.WriteLine(oddEvenPair[0]);
Console.WriteLine(oddEvenPair[1]);
}
控制台。写入线(“完成”);
Console.ReadLine();
}
它将一次打印出一对数据,然后在下一对数据之间等待一秒钟
{1 sec wait}
1
2
{1 sec wait}
3
4
{1 sec wait}
5
6
{1 sec wait}
7
8
{1 sec wait}
9
10
Finished
为什么要使用TAP执行此简单操作?什么是异步的?欢迎来到StackOverflow。为什么这些方法是异步的?它们同步返回值。如果它只是一个简化的示例,那么您应该尝试使用
Zip
,如下所示:var numbers=(await GetOddNumbers()).Zip(await GetEvenNumbers())对不起,我没有弄平它。您应该在linq表达式的末尾添加以下内容:.SelectMany((f)=>newint[]{f.First,f.Second})
谢谢。这会奏效的。但我的目的更多的是合并2个任务,这样,将检索Task1的第一个值,然后检索Task2的第一个值,然后检索Task1的第二个值,然后检索Task2的第二个值,依此类推。。我希望使用TAP可以实现这一点。问题只是一个样本数据。但在实时中,这些值将被异步检索。@VinothKarunathy是的,我完全得到了你想要的。我将在几分钟内根据这些新要求更新我的答案。@Vinothkar一致我已经更新了我的答案,请检查一下。