【问题标题】:Smartest way to convert an array of the form [][] to [,]?将 [][] 形式的数组转换为 [,] 的最聪明方法?
【发布时间】:2013-08-16 15:30:05
【问题描述】:

如果你有一个像 string[][] 这样的数组,假设前一个数组是矩形(不是锯齿状),那么将它转换为像 string[,] 这样的常规多维数组的最聪明的方法是什么?

我能想到的唯一方法是获取维度,用这些维度声明一个多维数组,然后循环遍历源数组并填充新数组。但我想知道是否有更简单的解决方案。

【问题讨论】:

  • 您提出的解决方案有什么问题?哪些方面不足以满足您的需求?
  • 另外,为什么你更喜欢[,] 而不是[][]?通常情况相反。
  • @YoryeNathan 好吧,多维数组改善了内存局部性。视情况而定,这可能是优势也可能是劣势。
  • @YoryeNathan 将数据从一维数组复制到多维数组比从锯齿状数组复制数据更容易吗?另请注意,制作两份而不是一份会产生戏剧性的性能成本。很可能是令人望而却步。至于废弃托管代码和直接复制底层内存,你只能从一维数组中做到这一点,这似乎一点也不简单。它似乎有点复杂。

标签: c# arrays


【解决方案1】:

只是为了好玩:完全同意这是一种矫枉过正的做法,最好的方法是正常迭代。

    //example jagged array
    string[][] ja = new string[2][];

    for (int i = 0; i < 2; i++)
        ja[i] = Enumerable.Range(0, 3).Select(k => "Cell [" + i + "," + k + "]").ToArray();

    //conversion to a 2D-array
    string[,] ka = new[] { new string[ja.Length, ja[0].Length] }
        .Select(_ => new { x = _, y = ja.Select((a, ia) => a.Select((b, ib) => _[ia, ib] = b).Count()).Count() })
        .Select(_ => _.x)
        .First();

    //dump result
    for (int i = 0; i < 2; i++)
        for (int k = 0; k < 3; k++)
        {
            Console.WriteLine(ka[i, k]);
        }

几乎不可读,但它可以工作(至少当初始数组不为空/格式错误时)。

【讨论】:

  • 非常酷。感谢您提供简洁的解决方案。我同意也许正常迭代确实是最好的解决方案。正确答案。
猜你喜欢
  • 1970-01-01
  • 2021-09-22
  • 2016-08-27
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
相关资源
最近更新 更多