如何从 C# 中的二维数组获取完整的行或列 [英] How to get a complete row or column from 2D array in C#
问题描述
我不想使用锯齿状数组,我有一个二维数组,我想获得一个完整的列或行,而不需要遍历它.有没有人知道如何做到这一点.
I do not want to use a jagged array and I have a 2D array and I want to get a complete column or row without looping through it. Does anyone have an idea how it can be done.
double [,] array = new double [3,3] ;
1 2 3
4 5 6
Out: 1 2 3 or 2 5
推荐答案
您可以使用 Buffer.BlockCopy()
优化它以获取行,但是要获取列,您必须循环.Buffer.BlockCopy()
最终使用处理器指令复制一块内存,所以速度相当快.
You can optimise it for getting rows by using Buffer.BlockCopy()
, but to get a column you'll have to loop. Buffer.BlockCopy()
ultimately uses a processor instruction to copy a block of memory, so it is pretty fast.
将代码放入扩展方法中,方便调用.注意Buffer.BlockCopy()
只能用于基本类型的数组,即int
、double
、char
等.这不包括 string
.
It's convenient to put the code into an extension method to make it easier to call. Note that Buffer.BlockCopy()
can only be used on arrays of primitive types, i.e. int
, double
, char
etc. This does NOT include string
.
这是一个可编译的例子:
Here's a compilable example:
using System;
using System.Linq;
using System.Runtime.InteropServices;
namespace ConsoleApplication4
{
public static class Program
{
private static void Main()
{
var array = new [,]
{
{0.1, 0.2, 0.3, 0.4, 0.5},
{1.1, 1.2, 1.3, 1.4, 1.5},
{2.1, 2.2, 2.3, 2.4, 2.5},
{3.1, 3.2, 3.3, 3.4, 3.5},
};
var row = array.GetRow(2);
// This prints 2.1, 2.2, 2.3, 2.4, 2.5
Console.WriteLine(string.Join(", ", row.Select(element => element.ToString())));
}
}
public static class ArrayExt
{
public static T[] GetRow<T>(this T[,] array, int row)
{
if (!typeof(T).IsPrimitive)
throw new InvalidOperationException("Not supported for managed types.");
if (array == null)
throw new ArgumentNullException("array");
int cols = array.GetUpperBound(1) + 1;
T[] result = new T[cols];
int size;
if (typeof(T) == typeof(bool))
size = 1;
else if (typeof(T) == typeof(char))
size = 2;
else
size = Marshal.SizeOf<T>();
Buffer.BlockCopy(array, row*cols*size, result, 0, cols*size);
return result;
}
}
}
这篇关于如何从 C# 中的二维数组获取完整的行或列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!