我有以下方法签名:
public void MyFunction(Object[,] obj)
我创建了这个对象:
List<List<Object>> obj = new List<List<Object>>;
有没有一种简单的方法可以将这个转换为Object[,]
?
更新:
事实上,我喜欢使用List
,因为我可以轻松地添加新项。 有没有一种方法可以声明我的List<>
对象以适应此需求? 我知道我的Object[,]
中的列数,但不知道行数。
我有以下方法签名:
public void MyFunction(Object[,] obj)
我创建了这个对象:
List<List<Object>> obj = new List<List<Object>>;
有没有一种简单的方法可以将这个转换为Object[,]
?
事实上,我喜欢使用List
,因为我可以轻松地添加新项。 有没有一种方法可以声明我的List<>
对象以适应此需求? 我知道我的Object[,]
中的列数,但不知道行数。
实际上,它们并不一定是兼容的数组。
[,]
定义了一个多维数组。 List<List<T>>
更符合锯齿形数组(object[][]
)的定义。
问题在于,对于您原始的对象,列表中包含的每个 List<object>
可能具有不同数量的对象。 您需要创建一个内部列表最大长度的多维数组,并使用 null 值进行填充或类似方法来匹配它。
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
元素包含的每个List<T>
具有相同的长度。(否则,您真的需要使用锯齿状数组。)
以下是使用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();
我猜想您无法更改需要传递此参数的函数。
我不明白为什么您不能一开始就使用一个 object[,]
。这是我的建议。
我怀疑这对您的情况没有帮助,但它可能会使您开始处理数组时更容易。您知道关于 List
的 .ToArray()
方法吗?