1

这是一些具有正确输出的示例代码

这个想法是我需要 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("---");
}
4

2 回答 2

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));  
于 2013-08-13T22:39:44.680 回答
1

您可以将它放在一行中,但是它的可读性不是很高:

var temp = Enumerable
    .Range(0, 6)
    .Select(i => mydata.Select(v 
        => i < v.Count() ? v.ElementAt(i) : -1).ToList())
    .ToArray();
于 2013-08-13T22:49:13.640 回答