如何从C#中的2D数组中获取完整的行或列 [英] How to get a complete row or column from 2D array in C#
问题描述
我不想使用锯齿状数组,而我有一个2D数组,我想获得完整的列或行而不循环遍历它.有谁知道如何做到这一点.
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#中的2D数组中获取完整的行或列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!