C# 获取双[,]矩形数组的双[]行数组
假设您有一个如下所示的数组:C# 获取双[,]矩形数组的双[]行数组,c#,.net,arrays,C#,.net,Arrays,假设您有一个如下所示的数组: double[,] rectArray = new double[10,3]; 现在,您希望第四行是由3个元素组成的双[]数组,而无需执行以下操作: double[] fourthRow = new double[]{rectArray[3,0], rectArray[3,1], rectArray[3,2]}; 有可能吗?甚
double[,] rectArray = new double[10,3];
现在,您希望第四行是由3个元素组成的双[]数组,而无需执行以下操作:
double[] fourthRow = new double[]{rectArray[3,0],
rectArray[3,1],
rectArray[3,2]};
有可能吗?甚至使用了一个元帅。什么方法
谢谢 您可能希望使用锯齿状数组。这不是一个10乘3的数组,而是一个数组数组 比如:
double[][] rectArray;
....
double [] rowArray = rectArray[3];
有很多地方可以学习更多关于锯齿阵列的知识。例如您可以使用
Buffer.BlockCopy
方法:
const int d1 = 10;
const int d2 = 3;
const int doubleSize = 8;
double[,] rectArray = new double[d1, d2];
double[] target = new double[d2];
int rowToGet = 3;
Buffer.BlockCopy(rectArray, doubleSize * d2 * rowToGet, target, 0, doubleSize * d2);
如果必须使用矩形数组并且只想简化语法,则可以使用如下方法获取行:
double[] fourthRow = GetRow(rectArray, 3);
public static T[] GetRow<T>(T[,] matrix, int row)
{
var columns = matrix.GetLength(1);
var array = new T[columns];
for (int i = 0; i < columns; ++i)
array[i] = matrix[row, i];
return array;
}
double[]fourthRow=GetRow(rectary,3);
公共静态T[]GetRow(T[,]矩阵,int行)
{
var columns=matrix.GetLength(1);
var数组=新的T[列];
对于(int i=0;i
LINQ救援:
var s = rectArray.Cast<double>().Skip(9).Take(3).ToArray();
var s=rectary.Cast().Skip(9.Take(3.ToArray());
说明:铸造多维数组会将其展平为一维数组。在这之后,我们所需要做的就是跳到我们想要的元素(二维数组中的第四个元素解析为跳过(9)…)并从中获取3个元素)。尽管这是一个旧线程,添加Joseph Sturtevants的答案可能会有用。如果矩阵的第一列不是零而是另一个整数,他的函数就会崩溃。 例如,从Excel检索数据时总是这样,如
object[,] objects = null;
Excel.Range range = worksheet.get_Range("A1", "C5");
objects = range.Cells.Value; //columns start at 1, not at 0
GetRow函数可以这样修改:
public static T[] GetRow<T>(T[,] matrix, int row, int firstColumn)
{
var columns = matrix.GetLength(1);
var array = new T[columns];
for (int i = firstColumn; i < firstColumn + columns; ++i)
array[i-firstColumn] = matrix[row, i];
return array;
}
publicstatict[]GetRow(T[,]矩阵,int行,int第一列)
{
var columns=matrix.GetLength(1);
var数组=新的T[列];
for(int i=firstColumn;i
为什么不创建一个通用扩展方法
public static T[] GetRow<T>(this T[,] input2DArray, int row) where T : IComparable
{
var width = input2DArray.GetLength(0);
var height = input2DArray.GetLength(1);
if (row >= height)
throw new IndexOutOfRangeException("Row Index Out of Range");
// Ensures the row requested is within the range of the 2-d array
var returnRow = new T[width];
for(var i = 0; i < width; i++)
returnRow[i] = input2DArray[i, row];
return returnRow;
}
如果您在获取一行后尝试链接方法,这将非常有用,并且对LINQ命令也很有帮助。对不起,我需要一个矩形数组。好的。。。但是你描述了一个你想做的任务,这个任务在锯齿数组中更有意义。(无论如何,它们通常更快更小。)@Hogan:我不明白你在说什么或指什么。@Hogan:对不起。我想你把我和别人搞混了。我没有回答这个问题,因为我不确定Block.BlockCopy是否是需要的,并且我不完全理解这个问题。然而,提问者显然有使用[,]的要求,建议某人替换实现并不是答案。因此,我投了反对票,并发表了评论来解释原因。我可以删除这个答案,但7年后我甚至都不会这么做。离开似乎很有用。有很多答案,所以正确的答案是“不要那样做”。假设一个答案是错误的,因为它从一个不同的方向看问题是错误的。我喜欢这种方法,但它对于我们的目的来说不够快,对不起。使用这种方法收益率将是非常好的唯一优化的答案!因此,
firstColumn
对于基于0的数组是0,对于基于1的数组是1?您得到的宽度和高度是混合的。谢谢。此解决方案的编辑和当前呈现的表示形式不是100%正确。你必须考虑到使用领域。如果将二维数组视为图像,则函数是正确的。但是如果你把它当作一个数学矩阵——我想应该是这样的——那么维度就必须被转换。在矩阵中,第一个参数是行数(高度别名y),第二个参数是列数(宽度别名x)。因此,请注意使用领域!对于数学函数,你必须在这个解决方案中切换“i”和“宽度”的参数位置。C++中使用C语言时的思维是一种痛苦。我多么想知道一个没有复制或锯齿阵列的解决方案。。。
array2D = new double[,];
// ... fill array here
var row = array2D.GetRow(4) // Implies getting 5th row of the 2-D Array