Транспонировать неровный список на прямую angular Один с помощью Linq C# - PullRequest
0 голосов
/ 12 февраля 2020

Мой вопрос очень похож на этот: Поворот - Перенос списка используя LINQ C#

За исключением того, что мое тестирование решений обращает мое внимание на то, что оно лучше всего работает даже с массивами, а не с неравномерными. Принятое решение и некоторые другие из приведенной выше ссылки, которую я извлек из любопытства, произвели транспонирование без восполнения недостатка информации в зубчатых списках.

{{"a"},
 {"b","c"}} 

будет преобразовано в

{{"a","b"},
 {"c"}} 

вместо

{{"a","b"},
 {null,"c"}}.

Мои исходные данные могут не иметь ничего, если, скажем, в конце того, что станет списком, есть три пустых места информации, они просто обрезаются без нуля. Мне нужна возможность вставлять пустые значения или какое-либо другое заданное значение c, когда списки не являются самой длинной длиной в исходных данных, когда я транспонирую. Я знаю, как лучше всего справиться с этим, просто используя стандартные циклы, но мне нужно решение с использованием Linq, с которым я, к сожалению, менее знаком.

Будет полезна любая помощь!

1 Ответ

1 голос
/ 12 февраля 2020

Хорошо, если мы хотим транспонировать зубчатую коллекцию, например,

  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...