Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将多维数组转换为列表<;列表<;双倍>>;?_C#_Arrays_Multidimensional Array - Fatal编程技术网

C# 如何将多维数组转换为列表<;列表<;双倍>>;?

C# 如何将多维数组转换为列表<;列表<;双倍>>;?,c#,arrays,multidimensional-array,C#,Arrays,Multidimensional Array,我正在尝试将一个double[,]转换为列表从性能角度看,最好的方法是什么。下面是一个O(n)转换解决方案。我认为没有比O(n)更快的算法 公共静态列表ConvertToListOfLists(双[,]数组) { 列表结果=新列表(); for(int i=0;i

我正在尝试将一个
double[,]
转换为
列表
从性能角度看,最好的方法是什么。

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

公共静态列表ConvertToListOfLists(双[,]数组)
{
列表结果=新列表();
for(int i=0;i
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]);
  }
将此代码与jagged数组中简洁但可读的代码进行比较:

double[][]源=。。。
列表结果=源
.Select(line=>line.ToList())
.ToList();

这就是为什么我们经常避免使用2D数组

这场演出对你有多重要?这种转换真的是应用程序中的瓶颈吗?“在性能方面,最好的方法是什么”-如果没有适当的证据,这只会导致大量没有性能数据的固执己见的答案。根据你的意见到目前为止你试过什么?你的绩效指标是什么?你的测量结果与你的目标相比如何?如果您需要帮助,请在此显示一些努力。这决不是我的应用程序中的瓶颈,因为be的强大功能有几个“感兴趣的区域”,使用静态数组,列表可能会很好地解释为什么这是“在性能方面做到这一点的最佳方法”这个答案可能与另一个答案几乎相同,但请注意使用了
列表
构造函数,它需要初始容量,这是一种性能增益,实际上不会影响可读性。
  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]);
  }
  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();