C# 二维阵列。将所有值设置为特定值
要为1D数组指定特定值,我使用LINQ,如下所示:C# 二维阵列。将所有值设置为特定值,c#,.net,C#,.net,要为1D数组指定特定值,我使用LINQ,如下所示: int[] nums = new int[20]; nums = (from i in nums select 1).ToArray<int>(); nums[0] = 2; int[]nums=newint[20]; nums=(从nums中的i选择1.ToArray(); nums[0]=2; 在2D([x,y])数组中也有类似的方法吗? 或者不使用嵌套循环的短路径?LINQ在
int[] nums = new int[20];
nums = (from i in nums select 1).ToArray<int>();
nums[0] = 2;
int[]nums=newint[20];
nums=(从nums中的i选择1.ToArray();
nums[0]=2;
在2D([x,y])数组中也有类似的方法吗?
或者不使用嵌套循环的短路径?LINQ在多维数组中工作得不太好 锯齿状阵列还不错:
var array = Enumerable.Range(0, 10)
.Select(x => Enumerable.Repeat('x', 10).ToArray())
.ToArray();
。。。但矩形阵列没有任何特定的支持。只需使用循环
(请注意使用
可枚举。重复作为创建一维数组的更简单方法,顺便说一句)。一种方法如下:
// 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();
//定义一个小函数,该函数只返回具有给定值的IEnumerable
静态IEnumerable填充(int值)
{
而(真)收益率回报值;
}
//从一维数组开始,然后为每个元素创建一个新数组,长度为10,值为2英寸
var ar=new int[20]。选择(a=>Fill(2)。获取(10.ToArray()).ToArray();
如果您真的想避免嵌套循环,可以只使用一个循环:
int[,] nums = new int[x,y];
for (int i=0;i<x*y;i++) nums[i%x,i/x]=n;
这可能是欺骗,因为它只是将循环代码移动到一个扩展方法,但它确实允许您简单地将2D数组初始化为单个值,方式类似于将1D数组初始化为单个值
首先,正如Jon Skeet所提到的,您可以清理初始化1D数组的示例,如下所示:
int[,] nums = GetNew2DArray(5, 20, 1);
int [] numbers = Enumerable.Repeat(1,20).ToArray();
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;
}
var nums = new int[10, 10];
nums.ClearTo(1);
使用我的扩展方法,您将能够像下面这样初始化2D数组:
int[,] nums = GetNew2DArray(5, 20, 1);
int [] numbers = Enumerable.Repeat(1,20).ToArray();
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;
}
var nums = new int[10, 10];
nums.ClearTo(1);
publicstatict[,]到2darray(这是IEnumerable项、int行、int列)
{
var矩阵=新的T[行,列];
int行=0;
int列=0;
foreach(项目中的T项目)
{
矩阵[行,列]=项目;
++栏目;
如果(列==列)
{
++行;
列=0;
}
}
收益矩阵;
}
我可以建议一种新的扩展方法吗
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;
}
}
}
}
您可以创建一个简单的方法,在所有元素上循环并初始化它们:
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;
}
}
}
publicstaticvoidfill2darray(T[,]arr,T值)
{
int numRows=arr.GetLength(0);
int numCols=arr.GetLength(1);
对于(int i=0;i
这使用与Array.Fill相同的语法,并适用于任何类型的数组您不在数组中设置值,创建新的数组谢谢您,但它是数组中的数组。我正在寻找在2D数组中实现这一点的方法[x,y]这主意不错,但我觉得太难了。我正在搜索像LINQ这样的简单东西。这个答案中的前两(两!!)行代码可以解决您的问题。我不会压缩格式,可能看起来很难看,但你不能得到比这更简单、更小和更快的格式。这样一个单独的for循环比嵌套的for循环快吗?这个扩展方法没有理由不是泛型的,我相应地更新了它。