一次访问数组中的整行

时间:2014-09-25 13:53:32

标签: c# arrays

我在C#中有一个二维数组。后来我想访问数组的元素 - 不仅一次一个,而且整行。

int[,] example = { { 1, 2, 3 }, { 4, 5, 6 }, {7, 8, 9} }
list<int> extract = ??? row1 of example ???

最快的方法是什么?

4 个答案:

答案 0 :(得分:3)

使用Linq你可以这样做:

List<int> extract = Enumerable.Range(0, example.GetLength(1))
       .Select(x => example[0,x])
       .ToList();

答案 1 :(得分:1)

除了遍历所有列,查看行中的每个值之外,您别无其他选择:

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];
}

答案 2 :(得分:0)

执行此操作的一种方法可能是不制作二维数组(可能是内部一维数组,其访问类似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]

来处理整个列

答案 3 :(得分:0)

执行此操作的最快方法可能是,如果您可以使用数组而不是结果列表,请使用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做一些时间安排。