c# LINQ,转换嵌套在foreach中的多个并行for循环

本文关键字:并行 循环 for foreach LINQ 转换 嵌套 | 更新日期: 2023-09-27 18:06:13

我的目标是掌握LINQ库函数。

我的问题是,我怎么能在一个SelectMany迭代调用多个选择?

考虑以下代码:

foreach(var i in array){
    for(int i=0; i<10; i++) 
       yield return someOtherArray[i];
    for(int i=0; i<10; i++) 
       yield return someOtherArray[i];
}

我知道与1循环嵌套的转换,

return array.SelectMany(x => 
           Enumerable.Range(0,10)
             .Select(i => someOtherArray[i]));

但是我到底是如何在selectMany范围内运行另一个分隔的内部for循环的呢?


编辑# 1

我需要在父数组

中遍历两个数组
foreach(var i in array) {
    for(int i=0; i<10; i++) 
        yield return someOtherArray_A[i];
    for(int i=0; i<10; i++) 
        yield return someOtherArray_B[i];
}

编辑# 2

很抱歉更改了这么多输入,我想让它更接近我真正的问题。

 foreach(var j in array) {
     for(int i=0; i<20; i++) 
         yield return someOtherArray_A[i];
     for(int i=0; i<10; i++) 
         yield return someOtherArray_B[i];
 }

c# LINQ,转换嵌套在foreach中的多个并行for循环

您当前的代码没有多大意义。现在,如果我改变你的代码,使它更有意义,它可以像这样,例如:

foreach(var item in array){
    for(int i=0; i<10; i++) 
       yield return item.someArray[i];
    for(int i=0; i<10; i++) 
       yield return item.someOtherArray[i];
}

内部循环遍历来自外部循环的数据。

当你使用Linq时,这会是什么样子呢?

return array.SelectMany(x =>
    x.someArray.Take(10).Concat(
        x.someOtherArray.Take(10)
    )
);

您可以使用.SelectMany()将内部序列组合成一个较长的序列,您可以使用.Concat()将两个序列粘合在一起,并将其作为一个序列使用。

使用@Maarten的Sensible版本的代码:

foreach(var item in array){
    for(int i=0; i<10; i++) 
       yield return item.someArray[i];
    for(int i=0; i<10; i++) 
       yield return item.someOtherArray[i];
}

所以你想为每个(外部)数组返回两个(内部)数组的前10个元素。

所以我们可以像这样对内部部分进行linq化:

    item.someArray.Take(10)                // the first 10 elements of this array
        .Concat(                           // followed by
            item.someOtherArray.Take(10)); // the first 10 elements of this array
} 

这将返回内部数组的任何类型的IEnumerable。现在我们要对外部数组中的所有项执行此操作,并将其作为单个序列返回,这正是SelectMany所做的:

array.SelectMany(item => item.someArray.Take(10).Concat(item.SomeOtherArray.Take(10)));