LINQ可以构造并返回一个多维数组

dav*_*pfx 4 .net c# linq arrays multidimensional-array

是的,我确实知道锯齿状数组[] []和多维数组[,]之间的区别.

是的,我找了重复,发现了这些:

其中最后一个包含完成工作的功能.但我的问题仍然是:是否有任何方法(无论多么扭曲或设计)说服LINQ以多维数组(而不是锯齿状数组)的形式构造和返回结果?


这与问题并不真正相关,但是这里导致的问题之一是看起来像是"为LINQ制作"的小工作之一,除了我需要调用的函数已经用多维数组参数定义.作为锯齿状数组产生答案的LINQ代码花了大约5分钟来编写,然后是什么?我错过了什么,或者LINQ 真的没办法完成这项工作吗?


我想我应该说:除了编写一大块代码以旧的方式执行它并将其作为lambda嵌入或将其称为扩展方法.现在它看起来好像LINQ既不能生成也不消耗多维数组,我的问题的答案是否定的.

Ert*_*maa 5

嗯......好吧?这是一个如何在可能的情况下将整数列表转换为二维数组的示例.

void Main()
{
    var wat = new[]{2, 4, 5, 6, 7, 8}
        .Select(x => new { dummy=1, val= x})
        .GroupBy(x => x.dummy) // group everything into one, "UNFLATTEN"
        .Select(gr => 
            {
                var elements = gr.Select(x => x.val).ToList();
                if(elements.Count == 0 || elements.Count % 2 != 0)
                    throw new NotSupportedException("I don't know what to do.");

                var halfSize = elements.Count / 2;

                int[,] ret = new int[2, halfSize];

                for(var k = 0; k < halfSize; k++){
                    ret[0, k] = elements[k];
                    ret[1, k] = elements[elements.Count - halfSize + k];
                }

                return ret;
            }
        ).First();

    wat.Dump();
}
Run Code Online (Sandbox Code Playgroud)

输出:

_ 0 1 2

0 2 4 5

1 6 7 8

正如其他人所说,你最好通过创建新的扩展方法:

static class LinqExtensions
{
    public static T[,] ToRectangularArray<T>(this IEnumerable<IEnumerable<T>> arrays)
    {
        // TODO: Validation and special-casing for arrays.Count == 0
        // TODO: Rename "arrays"
        // TODO: Make sure that Count() is used only once,
        // TODO: ElementAt() does not work everywhere, you're better off using ToList() before!
        int minorLength = arrays.First().Count();
        T[,] ret = new T[arrays.Count(), minorLength];
        for (int i = 0; i < arrays.Count(); i++)
        {
            var array = arrays.ElementAt(i);
            if (array.Count() != minorLength)
            {
                throw new ArgumentException
                    ("All arrays must be the same length");
            }
            for (int j = 0; j < minorLength; j++)
            {
                ret[i, j] = array.ElementAt(j);
            }
        }
        return ret;
    }
}

void Main()
{
    var wat = new[]{new[]{2, 4, 5}, new[]{6, 7, 8}}.ToRectangularArray();
    wat.Dump();
}
Run Code Online (Sandbox Code Playgroud)

为了便于使用,您可能需要为其添加相同的扩展方法IEnumerable<T>,并将其称为:ToRectangularArray<T>(this IEnumerable<T> input, int dimensions = 2)