要为1D数组指定特定值,我正在使用LINQ,如下所示:
int[] nums = new int[20];
nums = (from i in nums select 1).ToArray<int>();
nums[0] = 2;
在2D([x,y])数组中有类似的方法吗? 还是简短的方法,不使用嵌套循环?
答案 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使用相同的语法,并且适用于任何类型的数组