繁体   English   中英

如何在C#中将2D数组转换为2D列表

[英]How to convert a 2D array to a 2D list in C#

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

List<List<string>>

我如何在C#中实现这一目标?

使用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

我更喜欢Hari的答案,但如果由于某种原因你无法访问Linq (.NET Framework <3.5)

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<string>对象中,然后在退出内部循环时将其添加到父List<List<string>>对象。

我已经将这些包含在二维数组中你实际上意味着一个锯齿状阵列 (非矩形)。 由于这是一个数组数组,您可以通过索引简单地访问内部数组,然后在其上调用.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();

那么,您可以使用自定义通用ToList()方法扩展2d数组:

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

另一种方法是使用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();

要生成所需的列表,可以使用这种方式:

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

从2D数组到列表

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数组到2D List

2D阵列到2D列表

使用扩展名。

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

暂无
暂无

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

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