【问题标题】:How to convert a 2D array to a 2D list in C#如何在 C# 中将二维数组转换为二维列表
【发布时间】:2016-09-24 07:01:13
【问题描述】:

我有一个二维字符串数组。我想把它转换成

List<List<string>>

如何在 C# 中实现这一点?

【问题讨论】:

    标签: c# list multidimensional-array


    【解决方案1】:

    使用扩展。

        public static List<List<T>> Convert2dToList<T>(this T[][] array)
        {
            if (array == null) return null;
            List<List<T>> mainList = new List<List<T>>();
            for (int i = 0; i < array.Length; i++)
            {
                List<T> list = array[i].ToList();
                mainList.Add(list);
            }
            return mainList;
        }
    

    然后这样调用

        static void Main(string[] args)
        {
            int[][] list = new int[3][]
            {
                new int[]{ -2,-3,3 }, 
                new int[]{ -5,-10,1 },
                new int[]{ 10,30,-5 }
            };
    
            List<List<int>> A = list.Convert2dToList();
        }
    

    【讨论】:

      【解决方案2】:

      好吧,您可以使用自定义泛型 ToList() 方法扩展二维数组:

      public static class ArrayHelper 
      {
          public static List<List<T>> ToList<T>(this T[,] array)
          {
              var result = new List<List<T>>();
              var lengthX = array.GetLength(0);
              var lengthY = array.GetLength(1);
      
              // the reason why we get lengths of dimensions before looping through
              // is because we would like to use `List<T>(int length)` overload
              // this will prevent constant resizing of its underlying array and improve performance
              for(int i = 0; i < lengthX  i++)            
              {
                  var listToAdd = new List<T>(lengthY);
      
                  for(int i2 = 0; i2 < lengthY; i2++)
                  {
                      listToAdd.Add(array[i, i2]);
                  }
      
                  result.Add(listToAdd);
              }       
      
              return result;
          }       
      }
      

      只需一行代码就可以相当简单地使用它:

      public class Program
      {   
          public static void Main()
          {
              int[,] array = new int[2,2] {{5,7},{9,14}};
      
              var result = array.ToList();        
          }
      }
      

      【讨论】:

        【解决方案3】:

        我更喜欢 Hari 的回答,但如果由于某种原因您无法访问 Linq (.NET Framework

        List<List<string>> lLString = new List<List<string>>();
        string[,] stringArray2D = new string[3, 3] {
            { "a", "b", "c" }, 
            { "d", "e", "f" }, 
            { "g", "h", "i" }, 
        };
        for (int i = 0; i < stringArray2D.GetLength(0); i++) {
            List<string> temp = new List<string>();
            for (int j = 0; j < stringArray2D.GetLength(1); j++) { 
                temp.Add(stringArray2D[i,j]);
            }
            lLString.Add(temp);
        }
        

        第一个循环遍历行,下一个循环遍历列。所有列 (strings) 都添加到单个 List&lt;string&gt; 对象中,然后在退出内部循环时将其添加到父 List&lt;List&lt;string&gt;&gt; 对象中。

        我已经包含了这些,因为二维数组实际上是指jagged array(非矩形)。由于这是一个数组数组,您可以简单地通过索引访问内部数组,然后在其上调用 .ToList()

        List<List<string>> lLString = new List<List<string>>();
        string[][] jaggedStringArray = new string[3][];
        jaggedStringArray[0] = new string[] { "a", "b", "c" };
        jaggedStringArray[1] = new string[] { "d", "e", "f", "g", "h" };
        jaggedStringArray[2] = new string[] { "i" };
        for (int i = 0; i < jaggedStringArray.Length; i++) {
            lLString.Add(jaggedStringArray[i].ToList());
        }
        

        如果您使用的是锯齿状数组并且 .NET Framework >= 3.5,您可以像这样将它与 Linq 结合使用

        List<List<string>> lLString = jaggedStringArray.Select(x => x.ToList()).ToList();
        

        【讨论】:

          【解决方案4】:

          另一种方法是使用 LINQ 等效的嵌套 for 循环:

          string[,] array = { { "00", "01", "02"}, { "10", "11", "12" } };
          
          var list = Enumerable.Range(0, array.GetLength(0))
              .Select(row => Enumerable.Range(0, array.GetLength(1))
              .Select(col => array[row, col]).ToList()).ToList();
          

          【讨论】:

            【解决方案5】:

            要生成需要的列表,可以这样用:

              public static List<List<string>> GenerateListOfListOfStrings(string[,] result)
                {
            
                    string[,] res = result;
                    List<List<string>> listObj = new List<List<string>>();
                    var list = new List<string>();
                    foreach (var s in result)
                    {
                       list.Add(s);
                    }
                    listObj.Add(list);
                    return listObj;
                }
            

            【讨论】:

              【解决方案6】:

              使用Linq 你可以做到这一点。

              var result list.Cast<string>() 
                          .Select((x,i)=> new {x, index = i/list.GetLength(1)})  // Use overloaded 'Select' and calculate row index.
                          .GroupBy(x=>x.index)                                   // Group on Row index
                          .Select(x=>x.Select(s=>s.x).ToList())                  // Create List for each group.  
                          .ToList();
              

              检查这个example

              【讨论】:

                【解决方案7】:

                从二维数组到列表

                double[,] d = new double[,]
                {
                    {1.0, 2.0},
                    {3.0, 4.0},
                    {5.0, 6.0},
                    {7.0, 8.0},
                    {9.0, 10.0}
                };
                List<double> lst = d.Cast<double>().ToList()
                

                从二维数组到二维列表

                2D array to 2D List

                【讨论】:

                • OP 要求List&lt;List&lt;&gt;&gt;
                猜你喜欢
                • 2011-12-04
                • 2022-01-15
                • 2021-03-11
                • 1970-01-01
                • 1970-01-01
                • 2020-10-04
                • 2019-01-23
                • 2012-03-08
                • 2021-11-23
                相关资源
                最近更新 更多