一次访问数组中的整行
本文关键字:数组 访问 一次 | 更新日期: 2023-09-27 18:24:41
我在C#中有一个二维数组。稍后我想访问数组的元素——不仅是一次访问一个,而且是一整行。
int[,] example = { { 1, 2, 3 }, { 4, 5, 6 }, {7, 8, 9} }
list<int> extract = ??? row1 of example ???
最快的方法是什么?
使用Linq可以实现如下目标:
List<int> extract = Enumerable.Range(0, example.GetLength(1))
.Select(x => example[0,x])
.ToList();
除了遍历所有列,查看行中的每个值,您别无选择:
public static IEnumerable<T> GetRow<T>(this T[,] array, int row)
{
for (int i = 0; i < array.GetLength(1); i++)
yield return array[row, i];
}
实现这一点的一种方法是不制作二维数组(可能是内部一维数组,可以像array[x,y] = __array[x + width * y]
一样访问,但使用数组数组(我不会在C#中编写确切的语法,因为我已经有5年没有做C#了,可能像int[][] arr = new int[3]; arr[0] = new int[3]; arr[1] = new int[3]; arr[2] = new int[3]
一样)。
然后,您将能够使用arr[n]
来寻址整个列
实现这一点的最快方法可能是使用数组而不是列表作为结果,使用Buffer.BlockCopy()
,如下所示:
using System;
using System.Linq;
namespace Demo
{
internal class Program
{
private static void Main()
{
int[,] example =
{
{ 1, 2, 3, 4},
{ 5, 6, 7, 8},
{ 9, 10, 11, 12},
{13, 14, 15, 16},
{17, 18, 19, 20},
};
int sourceColumns = example.GetUpperBound(0);
int[] row1 = new int[sourceColumns];
int requiredRow = 3;
int sourceOffset = requiredRow * sourceColumns * sizeof(int);
int sourceWidthBytes = sourceColumns*sizeof (int);
Buffer.BlockCopy(example, sourceOffset, row1, 0, sourceWidthBytes);
// Now row1 contains 13, 14, 15, 16. Prove it by writing to display:
Console.WriteLine(string.Join(", ", row1));
// If you really must have a List<int>
// (but this will likely make it much slower than just
// adding items to the list on an element-by-element basis):
var list = new List<int>(row1);
// Do something with list.
}
}
}
但是,不要对什么更快做任何假设。
对Stopwatch
进行一些时间安排,以确保发布版本。