首页 > 解决方案 > C# 锯齿状数组到列表列表

问题描述

给定一个锯齿状数组:

int[][] edges = new int[][] 
            {
                new int[] {0,1},
                new int[] {0,2},
                new int[] {0,3},
                new int[] {1,4},
            };

有没有更优雅的方法来做到这一点:

var adjlist = new List<List<int>>();
            for(int i=0; i<n; i++)
            {
                adjlist.Add(new List<int>());
            }
            
            foreach(var arr in edges)
            {
                int src = arr[0];
                int dst = arr[1];

                adjlist[src].Add(dst);
                adjlist[dst].Add(src);
            }

改善时间复杂度的东西将是理想的。

谢谢你。

标签: c#listjagged-arrays

解决方案


我的假设是您示例中的代码没有按您的预期工作(我可能错了)。然而,将锯齿状数组转换为列表列表应该像下面这样简单。我怀疑你会比这更有效率,尽管你可以进行基准测试。

以下是 O(n),这意味着某处需要迭代每个元素。也就是说,记忆不能被魔法。话虽如此,将使用集合ToList调用List构造函数并使用反过来使用的实例成员,因此对数据类型和平台进行了极大的优化。CopyToArray.Copy

var results = edges.Select(x => x.ToList()).ToList();

推荐阅读