2D阵列。将所有值设置为特定值

时间:2012-03-27 16:52:25

标签: c# .net

要为1D数组指定特定值,我正在使用LINQ,如下所示:

        int[] nums = new int[20];
        nums = (from i in nums select 1).ToArray<int>();
        nums[0] = 2;

在2D([x,y])数组中有类似的方法吗? 还是简短的方法,不使用嵌套循环?

6 个答案:

答案 0 :(得分:6)

LINQ在多维数组中效果不佳。

锯齿状阵列也不错:

var array = Enumerable.Range(0, 10)
                      .Select(x => Enumerable.Repeat('x', 10).ToArray())
                      .ToArray();

...但矩形阵列没有任何特定支持。只需使用循环。

(注意使用Enumerable.Repeat作为一种更简单的方法来创建一维数组,顺便说一句。)

答案 1 :(得分:6)

如果你真的想避免嵌套循环,你可以只使用一个循环:

int[,] nums = new int[x,y];
for (int i=0;i<x*y;i++) nums[i%x,i/x]=n; 

您可以通过将其放入实用程序类中的某个函数来使其更容易:

public static T[,] GetNew2DArray<T>(int x, int y, T initialValue)
{
    T[,] nums = new T[x, y];
    for (int i = 0; i < x * y; i++) nums[i % x, i / x] = initialValue;
    return nums;
}

并像这样使用它:

int[,] nums = GetNew2DArray(5, 20, 1);

答案 2 :(得分:3)

嗯,这可能是作弊,因为它只是将循环代码移动到扩展方法,但它确实允许您简单地将2D数组初始化为单个值,并且类似于初始化一维数组的方式单个值。

首先,正如Jon Skeet所提到的那样,你可以清理一下像这样初始化一维数组的例子:

int [] numbers = Enumerable.Repeat(1,20).ToArray();

使用我的扩展方法,您将能够像这样初始化2D数组:

public static T[,] To2DArray<T>(this IEnumerable<T> items, int rows, int columns)
{
    var matrix = new T[rows, columns];
    int row = 0;
    int column = 0;

    foreach (T item in items)
    {
        matrix[row, column] = item;
        ++column;
        if (column == columns)
        {
            ++row;
            column = 0;
        }
    }

    return matrix;
}

答案 3 :(得分:1)

你可以这样做的一种方式是:

// Define a little function that just returns an IEnumerable with the given value
static IEnumerable<int> Fill(int value)
{
    while (true) yield return value;
}

// Start with a 1 dimensional array and then for each element create a new array 10 long with the value of 2 in
var ar = new int[20].Select(a => Fill(2).Take(10).ToArray()).ToArray();

答案 4 :(得分:1)

我可以建议一种新的扩展方法。

public static class TwoDArrayExtensions
{
    public static void ClearTo(this int[,] a, int val)
    {
        for (int i=a.GetLowerBound(0); i <= a.GetUpperBound(0); i++)
        {
            for (int j=a.GetLowerBound(1); j <= a.GetUpperBound(1); j++)
            {
                a[i,j] = val;
            }
        }
    }
}

像这样使用:

var nums = new int[10, 10];
nums.ClearTo(1);

答案 5 :(得分:0)

您可以创建一个简单的方法来遍历所有元素并对其进行初始化:

public static void Fill2DArray<T>(T[,] arr, T value)
{
    int numRows = arr.GetLength(0);
    int numCols = arr.GetLength(1);

    for (int i = 0; i < numRows; ++i)
    {
        for (int j = 0; j < numCols; ++j)
        {
            arr[i, j] = value;
        }
    }
}

这与Array.Fill使用相同的语法,并且适用于任何类型的数组