You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否使用单个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:10:25