Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 二维阵列。将所有值设置为特定值_C#_.net - Fatal编程技术网

C# 二维阵列。将所有值设置为特定值

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在

要为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在多维数组中工作得不太好

锯齿状阵列还不错:

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循环快吗?这个扩展方法没有理由不是泛型的,我相应地更新了它。