如何将列表转换为多维数组?

我有以下方法签名:

public void MyFunction(Object[,] obj) 

我创建了这个对象:

 List<List> obj = new List<List>; 

有没有一种简单的方法可以将其转换为Object[,]


更新:

事实是我喜欢使用List因为我可以轻松添加一个新项目。 有没有办法可以声明我的List对象以满足这种需要? 我知道Object[,]的列数Object[,]但不知道行数。

实际上,这些不一定是兼容的arrays。

[,]定义了一个多维数组。 List>更多地对应于锯齿状数组( object[][] )。

问题在于,对于原始对象, List包含的每个List可以具有不同数量的对象。 您需要创建一个内部列表最大长度的多维数组,并使用空值或其他内容填充以使其匹配。

你不会为此得到一个非常简单的解决方案(即几行)。 在这种情况下,LINQ / Enumerable类不会帮助你(尽管如果你想要一个锯齿状数组,也就是Object[][] )。 在这种情况下,纯嵌套迭代可能是最好的解决方案。

 public static T[,] To2dArray(this List> list) { if (list.Count == 0 || list[0].Count == 0) throw new ArgumentException("The list must have non-zero dimensions."); var result = new T[list.Count, list[0].Count]; for(int i = 0; i < list.Count; i++) { for(int j = 0; j < list[i].Count; j++) { if (list[i].Count != list[0].Count) throw new InvalidOperationException("The list cannot contain elements (lists) of different sizes."); result[i, j] = list[i][j]; } } return result; } 

我在函数中包含了一些error handling,因为如果在非方形嵌套列表中使用它,可能会导致一些混乱的错误。

当然,该方法假定包含为父List的元素的每个List具有相同的长度。 (否则你真的需要使用锯齿状数组。)

这是使用Linq的Aggregate扩展的解决方案。

请注意,下面不检查,也不关心它是否有一个锯齿状子列表,它使用所有子列表的最大大小并根据当前列表填写。 如果这是一个问题,可以添加检查if以检查所有子列表中的相同计数。

 public static T[,] To2DArray(this List> lst) { if ((lst == null) || (lst.Any (subList => subList.Any() == false))) throw new ArgumentException("Input list is not properly formatted with valid data"); int index = 0; int subindex; return lst.Aggregate(new T[lst.Count(), lst.Max (sub => sub.Count())], (array, subList) => { subindex = 0; subList.ForEach(itm => array[index, subindex++] = itm); ++index; return array; } ); } 

测试/使用

 var lst = new List>() { new List() { "Alpha", "Beta", "Gamma" }, new List() { "One", "Two", "Three" }, new List() { "A" } }; var newArray = lst.To2DArray(); 

结果:

在此处输入图像描述

坦率地说,答案是否定的,不容易。

也许您想编辑您的问题,以便为我们提供更多关于为什么需要这些声明的背景知识,我们可以帮助您解决根本问题?


你的更新:

我假设您无法更改传递此function所需的function。

我不明白为什么你不能只使用一个object[,]开始。 这是我的建议。

我怀疑这会对你的情况有所帮助,但它可能会使你的一些arrays更容易开始。 你知道List上的.ToArray()方法吗?