Вот решение, использующее расширение 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();
Результат: