【问题标题】:Initialize a Jagged Array the LINQ Way以 LINQ 方式初始化锯齿状数组
【发布时间】:2010-11-09 03:23:56
【问题描述】:

我有一个二维锯齿状数组(尽管它总是矩形),我使用传统循环对其进行初始化:

var myArr = new double[rowCount][];
for (int i = 0; i < rowCount; i++) {
    myArr[i] = new double[colCount];
}

我想也许一些 LINQ 函数会给我一种优雅的方式来在一个语句中执行此操作。但是,我能想到的最接近的是:

double[][] myArr = Enumerable.Repeat(new double[colCount], rowCount).ToArray();

问题在于它似乎正在创建一个 double[colCount] 并分配对该 intsead 的引用,即为每一行分配一个新数组。有没有办法做到这一点而不会太神秘?

【问题讨论】:

    标签: c# linq arrays initialization jagged-arrays


    【解决方案1】:
    double[][] myArr = Enumerable
      .Range(0, rowCount)
      .Select(i => new double[colCount])
      .ToArray();
    

    【讨论】:

      【解决方案2】:

      由于new 发生在对Repeat 的调用之前,您将无法使用。您需要一些也可以重复创建数组的东西。这可以通过使用Enumerable.Range method 生成一个范围然后执行Select operation 来实现,该Select operation 将范围的每个元素映射到一个新的数组实例(如Amy B's answer)。

      但是,我认为您正在尝试在这种情况下不适合这样做的地方使用 LINQ。您在 LINQ 解决方案之前所拥有的一切都很好。当然,如果你想要一个类似于Enumerable.Repeat 的 LINQ 风格的方法,你可以编写自己的扩展方法来生成一个新项目,例如:

          public static IEnumerable<TResult> Repeat<TResult>(
                Func<TResult> generator,
                int count)
          {
              for (int i = 0; i < count; i++)
              {
                  yield return generator();
              }
          }
      

      那么你可以这样称呼它:

         var result = Repeat(()=>new double[rowCount], columnCount).ToArray();
      

      【讨论】:

      • 与我的答案完全相同...但你更快;)
      【解决方案3】:

      行为正确 - Repeat() 多次返回包含所提供对象的序列。您可以执行以下技巧。

      double[][] myArr = Enumerable
          .Repeat(0, rowCount)
          .Select(i => new double[colCount])
          .ToArray();
      

      【讨论】:

        【解决方案4】:

        你不能用Repeat 方法做到这一点:element 参数只计算一次,所以它确实总是重复同一个实例。相反,你可以创建一个方法来做你想做的事,它需要一个 lambda 而不是一个值:

            public static IEnumerable<T> Sequence<T>(Func<T> generator, int count)
            {
                for (int i = 0; i < count; i++)
                {
                    yield return generator();
                }
            }
        
            ...
        
            var myArr = Sequence(() => new double[colCount], rowCount).ToArray();
        

        【讨论】:

          【解决方案5】:

          我刚刚写了这个函数……

              public static T[][] GetMatrix<T>(int m, int n)
              {
                  var v = new T[m][];
                  for(int i=0;i<m; ++i) v[i] = new T[n];
                  return v;
              }
          

          似乎有效。

          用法:

          float[][] vertices = GetMatrix<float>(8, 3);
          

          【讨论】:

            【解决方案6】:

            怎么样

            var myArr = new double[rowCount, colCount];
            

            double myArr = new double[rowCount, colCount];
            

            参考:http://msdn.microsoft.com/en-us/library/aa691346(v=vs.71).aspx

            【讨论】:

            • 这不是按照要求创建锯齿状数组。
            • 对不起,Servy,你是对的。您已经提到数组始终是矩形的,那么为什么需要锯齿状数组呢?满足第一个位置的数组是动态加载的,或者您试图避免任何类型的限制,例如内存?
            • 这不是我的程序。我不知道他为什么需要一个锯齿状数组而不是多维数组。
            猜你喜欢
            • 2010-12-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-06-17
            • 2014-05-03
            • 2011-08-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多