是否可以使用单个SelectMany来获得以下序列?

时间:2018-02-01 14:40:58

标签: c#

我想得到以下顺序:

enter image description here

是否可以使用一个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);
    var z = x.SelectMany(m => y, (m, n) => new int[] { m, n }).SelectMany(o => o);
    foreach (int n in z)
        Console.Write($"{n},");
    Console.WriteLine("\b.");
}

3 个答案:

答案 0 :(得分:1)

您可以使用Tuple

var z = x.SelectMany(m => y, (m, n) => new { m, n }).Select(k => Tuple.Create(k.m, k.n));

甚至更简单的新C#7.0特征值元组:

var z = x.SelectMany(m => y, (m, n) => new { m, n }).Select(k => (k.m, k.n));

答案 1 :(得分:1)

你正在做的是笛卡尔积,然后展平它。它可以通过其他几种方式很好地完成:

var z = from m in x
from n in y
from t in new []{m,n}
select t;

这可能是最好看的

var z = x.Join(y, _=>1, _=>1, (m,n)=>new int[] { m, n }).SelectMany(o => o);

这更接近原作,但用连接代替你的第一个SelectMany。关键选择器都是_=>1,因为您需要笛卡尔积,这将为您提供。

答案 2 :(得分:1)

尽管你需要,为了代码清晰,我建议你只使用嵌套循环,例如。

IEnumerable<int> DummySequence(int n)
{
    var odd = Enumerable.Range(1, n).Where(x => x % 2 == 1);
    var even = Enumerable.Range(1, n).Where(x => x % 2 == 0).ToArray();

    foreach (var oddNumber in odd)
    {
        foreach (var evenNumber in even)
        {
            yield return oddNumber;
            yield return evenNumber;
        }
    }
}