能否使用单个SelectMany方法生成目标整数序列?
单个SelectMany实现目标整数序列
当然可以!咱们先拆解下你原来的代码逻辑:你先从1-7里筛选出奇数集合x(1、3、5)和偶数集合y(2、4、6),然后第一次SelectMany把每个奇数和每个偶数配对成int[] {m,n},再用第二次SelectMany把这些数组逐一拆平,最终得到交替的奇偶序列。
其实完全可以把这两步合并成单个SelectMany调用,核心在于SelectMany本身就具备“展开嵌套可枚举序列”的能力——它的结果选择器可以直接返回包含两个元素的小序列,而不是先生成数组再二次展开。
修改后的代码示例
static void Main() { var x = Enumerable.Range(1, 7).Where(n => n % 2 == 1); var y = Enumerable.Range(1, 7).Where(n => n % 2 == 0); // 单个SelectMany直接生成并展开目标序列 var z = x.SelectMany(m => y, (m, n) => new[] { m, n }); foreach (int n in z) Console.Write($"{n},"); Console.WriteLine("\b."); }
为什么这样可行?
SelectMany的第三个参数(结果选择器)返回的new[] { m, n }是一个int[],而数组本身实现了IEnumerable<int>。SelectMany会自动遍历每个奇数m对应的所有偶数n,把每个{m,n}数组里的元素依次提取出来,合并成一个连续的序列——这刚好完成了你原来两次SelectMany的工作:先配对、再拆平。
运行这段代码,你会得到和原代码完全一致的输出:1,2,1,4,1,6,3,2,3,4,3,6,5,2,5,4,5,6.
如果你想更明确地表达“返回两个元素的序列”,也可以用Enumerable的静态方法代替数组,效果是一样的:
var z = x.SelectMany(m => y, (m, n) => Enumerable.Empty<int>().Append(m).Append(n));
内容的提问来源于stack exchange,提问作者Display Name
相关产品推荐
相关产品推荐

