Ну, вы могли бы достаточно легко написать метод расширения для этого. Примерно так (только слегка проверено):
public static T[,] ToRectangularArray<T>(this IEnumerable<T[]> source)
{
if (!source.Any())
{
return new T[0,0];
}
int width = source.First().Length;
if (source.Any(array => array.Length != width))
{
throw new ArgumentException("All elements must have the same length");
}
T[,] ret = new T[source.Count(), width];
int row = 0;
foreach (T[] array in source)
{
for (int col=0; col < width; col++)
{
ret[row, col] = array[col];
}
row++;
}
return ret;
}
Немного обидно, что в приведенном выше коде в качестве типа элемента используется T []. Из-за общей инвариантности я не могу сейчас сделать источник IEnumerable<IEnumerable<T>>
, что было бы неплохо. Альтернативой может быть введение нового параметра типа с ограничением:
public static T[,] ToRectangularArray<T,U>(this IEnumerable<U> source)
where U : IEnumerable<T>
Немного волосатый, но это должно сработать. (Очевидно, что реализация тоже нуждается в некоторых изменениях, но основной принцип тот же.)