【问题标题】:Use LINQ to get length of dimensions of Array使用 LINQ 获取数组维度的长度
【发布时间】:2025-11-29 04:20:01
【问题描述】:

我有一个数组,我想获取存储在数组中的每个维度的长度。 IE。我想要以下内容:

Array myArray = //...Blah blah myArray is defined somewhere in code

int[] dimLengths = myArray.SomeLinqStatement...

我可以用一些 for 循环来做到这一点,但我希望会有一个简单的 linq 语句。例如,如果 myArray 是 2x3x4 的 3D 数组,我希望 dimLengths 为 {2, 3, 4}。

【问题讨论】:

    标签: arrays linq multidimensional-array dimensions


    【解决方案1】:

    您不需要 LINQ。这是一个简单的解决方案:

    int[] GetDimensions(Array array)
    {
        int[] dimensions = new int[array.Rank];
        for (int i = 0; i < array.Rank; i++)
        {
            dimensions[i] = array.GetLength(i);
        }
        return dimensions;
    }
    

    如果你必须使用 LINQ,你可以试试这个,虽然我相信另一种方式更好:

    int[] dimensions = Enumerable.Range(0, array.Rank)
                                 .Select(i => array.GetLength(i))
                                 .ToArray();
    

    【讨论】:

    • 出于好奇,是什么让您“确定”非 linq 方式更好?
    • 经验,以及对 LINQ 工作方式的理解。 LINQ 版本与其他版本做同样的事情,加上两个额外的操作:它需要生成一个整数序列来处理,它需要将IEnumerable 转换为一个数组。了解问题的代码几乎总是比不了解问题的代码快。
    • @KendallFrey:但差异可以忽略不计(在这种情况下是肯定的)。那么可读性应该是首选。
    • @TimSchmelter:总是测量它。它很可能可以忽略不计,但在检查之前您无法判断。
    • 为什么不使用方法#1(非linq)并使其成为扩展方法。
    【解决方案2】:

    为什么需要 LINQ 来获取 `Array's 维度的长度?

    myArray.GetLength(0); //returns the length of the first dimension
    myArray.GetLength(1); //returns the length of the second dimension
    myArray.GetLength(2); //returns the length of the third dimension
    

    Array.GetLength Method

    这是你的“性感”LINQ 方法:

    int[, ,] array3D = new int[,,] { { { 1, 2, 3 }, { 4, 5, 6 } }, 
                                 { { 7, 8, 9 }, { 10, 11, 12 } } };
    var result = Enumerable.Range(0, array3D.Rank)
          .Select(i => array3D.GetLength(i))
          .ToArray();
    

    【讨论】:

    • 因为我想要一个包含所有维度长度的数组。我知道我可以使用 for 循环和 GetLength 方法。我只是想用 linq 的性感来做这一切:)
    • @KrisTrip:测试我的其他方法。