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()).SelectMany((f)=>newint[]{f.First,f.Second})
    谢谢。这会奏效的。但我的目的更多的是合并2个任务,这样,将检索Task1的第一个值,然后检索Task2的第一个值,然后检索Task1的第二个值,然后检索Task2的第二个值,依此类推。。我希望使用TAP可以实现这一点。问题只是一个样本数据。但在实时中,这些值将被异步检索。@VinothKarunathy是的,我完全得到了你想要的。我将在几分钟内根据这些新要求更新我的答案。@Vinothkar一致我已经更新了我的答案,请检查一下。