Хорошо, если мы хотим транспонировать зубчатую коллекцию, например,
var source = new string[][] {
new string[] {"a", "b", "c"},
new string[] {"d"},
new string[] {"e", "f"},
new string[] {"g", "h", "i", "j"},
};
, мы можем вычислить число columns
: я поставил .Count()
, так что List<List<string>>
и string[][]
будут делать .
int columns = source.Max(line => null == line ? 0 : line.Count());
и затем, если мы хотим исключить null
s, отфильтровываем строки, у которых нет необходимого количества элементов:
// Change .ToArray() to .ToList() if you want to have jagged List
var result = Enumerable
.Range(0, columns)
.Select(c => source
.Where(line => line != null && line.Count() > c)
.Select(line => line[c])
.ToArray())
.ToArray();
Давайте посмотрим:
string report = string.Join(Environment.NewLine, result
.Select(line => string.Join(" ", line.Select(c => c ?? "-"))));
Console.Write(report);
Результат:
a d e g
b f h
c i
j
Обратите внимание, что транспонирование с null
s для отверстий будет
var result = Enumerable
.Range(0, columns)
.Select(c => source
.Select(line => line == null || line.Count() <= c ? null : line[c])
.ToArray())
.ToArray();
Результат :
a d e g
b - f h
c - - i
- - - j