【问题标题】:2D Array. Set all values to specific value二维阵列。将所有值设置为特定值
【发布时间】:2012-03-27 16:52:25
【问题描述】:

要为一维数组分配特定的值,我正在使用 LINQ,如下所示:

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

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

【问题讨论】:

  • 您没有在数组中设置值,而是创建了一个 new 数组

标签: c# .net


【解决方案1】:

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

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);

【讨论】:

  • 好主意,但在我看来太难了。我正在寻找像 LINQ 这样简单的东西。
  • 此答案中的前两行(两行!!)代码解决了您的问题。我没有压缩格式,可能看起来很难看,但你没有比这更简单、更小和更快的了。
  • 与嵌套的 for 循环相比,这样的单个 for 循环会更快吗?
【解决方案2】:

LINQ 不适用于多维数组。

锯齿状数组还不错:

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

...但是矩形数组没有任何特定的支持。只需使用循环。

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

【讨论】:

    【解决方案3】:

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

    首先,正如 Jon Skeet 所提到的,您可以清理初始化一维数组的示例,如下所示:

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

    【讨论】:

    • 这个扩展方法没有理由不通用,我相应地更新了它。
    【解决方案4】:

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

    // 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();
    

    【讨论】:

    • 谢谢,不过是数组里面的数组。我正在寻找在二维数组 [x, y] 中执行此操作的方法
    【解决方案5】:

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

    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);
    

    【讨论】:

      【解决方案6】:

      您可以创建一个简单的方法来循环所有元素并初始化它们:

      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 相同的语法,适用于任何类型的数组

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-08
        • 2022-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-22
        • 1970-01-01
        相关资源
        最近更新 更多