如何转换列表<>到一个多维数组?

时间:2009-03-24 16:29:13

标签: c# .net arrays list

我有以下方法签名:

public void MyFunction(Object[,] obj)

我创建了这个对象:

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

我可以通过简单的方法将其转换为Object[,]吗?


更新

事实上,我喜欢使用List,因为我可以轻松添加新项目。有没有办法可以声明我的List<>对象符合这个需求?我知道Object[,]中的列数,但不知道行数。

4 个答案:

答案 0 :(得分:11)

没有。实际上,这些不一定是兼容的阵列。

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

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

答案 1 :(得分:6)

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

public static T[,] To2dArray(this List<List<T>> 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;
}

我在函数中包含了一些错误处理,因为如果你在非方形嵌套列表中使用它可能会导致一些令人困惑的错误。

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

答案 2 :(得分:2)

以下是使用Linq Aggregate扩展名的解决方案。

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

public static T[,] To2DArray<T>(this List<List<T>> 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<List<string>>() { new List<string>() { "Alpha", "Beta", "Gamma" },
                                     new List<string>() { "One", "Two", "Three" },
                                     new List<string>() { "A" }
                                 };
var newArray = lst.To2DArray();

结果:

enter image description here

答案 3 :(得分:-2)

说实话,答案是否定的,不容易。

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


重新更新:

我假设您无法更改将其传递到的所需功能。

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

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