以下是example code with the correct output
这个想法是我需要6行。我不关心我有多少列。 IEnumerable是我的专栏。我希望第一行保存每个IEnumerable的第一个值。第二行保持第二行等。如果IEnumerable /列中没有足够的值,则将-1作为占位符。
这段代码可以实现,但我确信有一个我可以使用的linq语句,而不是以这种方式实现它。知道怎么用linq做这个吗?
var mydata = new IEnumerable<int>[] { Enumerable.Range(2, 3), Enumerable.Range(5, 5), Enumerable.Range(7, 6), Enumerable.Range(3, 2) };
var temp = new List<int>[6];
for (int i = 0; i < 6; ++i)
temp[i] = new List<int>();
foreach (var v in mydata)
{
var len = v.Count();
int i;
for (i = 0; i < 6&&i<len; ++i)
{
temp[i].Add(v.ElementAt(i));
}
for (; i < 6; ++i)
temp[i].Add(-1);
}
foreach (var outer in temp)
{
foreach (var inner in outer)
{
Console.WriteLine(inner);
}
Console.WriteLine("---");
}
答案 0 :(得分:4)
这样的事情应该有效:
var mydata = new IEnumerable<int>[] { Enumerable.Range(2, 3), Enumerable.Range(5, 5), Enumerable.Range(7, 6), Enumerable.Range(3, 2) };
var maxLength = mydata.Max(l => l.Count());
var rotated =
from i in Enumerable.Range(0, maxLength)
select
from list in mydata
select list.Skip(i).DefaultIfEmpty(-1).First();
或者用流利的语法:
var rotated = Enumerable.Range(0, maxLength)
.Select(i => mydata.Select(l => l.Skip(i).DefaultIfEmpty(-1).First()));
现在,这不是非常有效,因为它需要多次迭代每个列表。如果首先将输入数据转换为数组列表,它应该更快一些:
var myarray = mydata.Select(l => l.ToArray());
var maxLength = myarray.Max(l => l.Length);
var rotated =
from i in Enumerable.Range(0, maxLength)
select
from l in myarray
select i < l.Length ? l[i] : -1;
或者用流利的语法:
var rotated = Enumerable.Range(0, maxLength)
.Select(i => myarray.Select(l => i < l.Length ? l[i] : -1));
答案 1 :(得分:1)
你可以把它放在一行,但它不会非常易读:
var temp = Enumerable
.Range(0, 6)
.Select(i => mydata.Select(v
=> i < v.Count() ? v.ElementAt(i) : -1).ToList())
.ToArray();