如何将多维数组转换为List <list <double>&gt;?

时间:2017-01-12 15:44:24

标签: c# arrays multidimensional-array

我正在尝试将admin.add_link(MenuLink(name='Logout', category='', url="/logout")) admin.add_link(MenuLink(name='Login', category='', url="/login")) 转换为double[,],这是表现明智的最佳方式。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

2D阵列不像锯齿状阵列那么方便,你可以试试这样的东西:

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

这就是我们经常避免使用2D数组的原因。