获取二维数组的“角”
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。以上是关于获取二维数组的“角”的主要内容,如果未能解决你的问题,请参考以下文章