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];
}
您当前的代码没有多大意义。现在,如果我改变你的代码,使它更有意义,它可以像这样,例如:
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)));