繁体   English   中英

如何将多维数组转换为列表<List<double> &gt;? [关闭]

[英]How to convert multidimensional array to List<List<double>>? [closed]

我正在尝试将double[,]转换为List<List<double>>明智地执行此性能的最佳方法是什么。

这是O(n)转换的解决方案。 我认为没有比O(n)更快的算法。

public static List<List<double>> ConvertToListOfLists(double[,] array)
{
    List<List<double>> result = new List<List<double>>();
    for (int i = 0; i < array.GetLength(0); i++)
    {
        List<double> row = new List<double>();
        for (int j = 0; j < array.GetLength(1); j++)
        {
            row.Add(array[i, j]);
        }
        result.Add(row);
    }

    return result;
}

二维数组不像锯齿数组那么方便,你可以尝试这样的事情:

  double[,] source = ...

  List<List<double>> result = new List<List<double>>(source.GetLength(0));

  for (int i = 0; i < source.GetLength(0); ++i) {
    List<double> line = new List<double>(source.GetLength(1));

    result.Add(line);

    for (int j = 0; j < source.GetLength(1); ++j)
      line.Add(source[i, j]);
  }

上面的代码假设source是一个通常的从零开始的数组; 基于任意数组的非常罕见(几乎是偏执的)情况下(如果要创建这样的数组,请参阅Array.CreateInstance以获取详细信息):

  double[,] source = ...

  List<List<double>> result = new List<List<double>>(source.GetLength(0));

  // please, notice <= comparison
  for (int i = source.GetLowerBound(0); i <= source.GetUpperBound(0); ++i) {
    List<double> line = new List<double>(source.GetLength(1));

    result.Add(line);

    // please, notice <= comparison
    for (int j = source.GetLowerBound(1); j <= source.GetUpperBound(1); ++j)
      line.Add(source[i, j]);
  }

将此代码与锯齿状数组的简洁但可读的代码进行比较:

  double[][] source = ... 

  List<List<double>> result = source
    .Select(line => line.ToList())
    .ToList(); 

这就是为什么我们经常避免使用二维数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM