获取二维数组的“角”

Posted

技术标签:

【中文标题】获取二维数组的“角”【英文标题】:Get "corners" of a 2d array 【发布时间】:2021-10-10 03:31:46 【问题描述】:

我有一个可以为空的整数的二维数组(尝试猜测它的确切用途)。 由此,我想从第一行和最后一行中获取第一个和最后一个非空元素。

我该怎么做?

class Foo

    int?[,] array = new int?[3,9]
    
         null ,   13 , 21   , null , null ,   52 ,   69 , 76 , null ,
            9 ,   15 , null ,   36 ,   45 , null , null , 77 , null ,
         null , null , null ,   39 ,   48 ,   53 , null , 79 ,   87 ,
    ;

【问题讨论】:

您希望 13, 76, 39,87 回来吗? 您可以从here 获得整体上的尺寸,但您需要遍历才能找到您的结果。请注意,您的问题标题并没有清楚地描述您在做什么:您不是在寻找角落。 “角”这个词让人联想到 0,0 0,8 2,0 2,8,这不是你想要的。 这能回答你的问题吗? How to get a complete row or column from 2D array in C# 和 How to get index using LINQ? 和 Find index of a value in an array 和 c# Array.FindAllIndexOf which FindAll IndexOf 和 Get the first and last item of an array 可能认为这很容易的反对者请注意 "an array is not a rectangle - it is a single linear space. Any concept of 'row' or 'column' is actually the invention of the user. There are no rows and no columns; any convention along the lines of ... is 'row x, column y' or 'column x, row y' is purely that: a convention; part of our imagination in conceptualizing something. The only real order is which index is navigated first. The first? or the last?",Marc Gravell,2013 年 6 月。 @Hayden 完全正确。 【参考方案1】:

由此,我想分别从第一行和最后一行获取第一个和最后一个非空元素。

2D 数组很麻烦,但是如果你对它们进行迭代,它们的行为就像一个长数组

var w = array.GetLength(1);
var h = array.GetLength(0);
var a = array.Cast<int?>();

var ff = a.First(e => e.HasValue);
var fl = a.Take(w).Last(e => e.HasValue);
var lf = a.Skip((h-1)*w).First(e => e.HasValue);
var ll = a.Last(e => e.HasValue);

Width 为 9,Height 为 3,Casting 将其转换为 int? 的可枚举,这意味着您的角是第一个非 null,最初 9 中的最后一个非 null,跳过 18 后的第一个非 null 和最后一个非空

【讨论】:

“2D 数组让人头疼” - 哈哈。是的,我很惊讶 C# 至少不是 row-major

以上是关于获取二维数组的“角”的主要内容,如果未能解决你的问题,请参考以下文章

二维码的方向角

php 怎样获取二维数组长度

PHP获取二维数组中相同的元素

如何获取二维数组的列数

jquery怎么获取二维数组的最后一个和除了最后一个以外的数据并输出?

获取二维数组的大小[重复]