我想得到以下顺序:
是否可以使用一个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.");
}
答案 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;
}
}
}