Как я могу отсортировать переменное количество столбцов с Linq C #? - PullRequest
1 голос
/ 28 мая 2019

Приведенный ниже код работает для сортировки двух столбцов (по фамилии, а затем по имени), однако мне нужно отсортировать по переменному количеству имен (2-5 на запись). Добавление еще одного разбиения ThenBy в пустое пространство вызывает исключение за пределами границ. Я понимаю почему, но мне было интересно, есть ли способ обойти этот код, чтобы заставить работать с Linq, или мне нужно пойти другим путем. Извиняюсь, если это просто, я полностью новичок в C #. Я некоторое время искал ответ и не могу его найти.

Код ниже выводит на консоль:

Jimbo Crab
Jonathan Crab
Michael Crab
Steve Cruthers
Barry John
David Johnson

Правильно упорядочено сначала по фамилии, затем по имени.

Однако имена, которые мне нужно отсортировать, имеют различную длину, например:

Барри Джон
Дэниел Джонсон Джеймс
Стив Дэвидсон, Эндрю Колинс
Лорна Майкл

Который должен производить:

Steve Davidson Andrew Colins
Daniel Johnson James
Barry John
Lorna Michael

Их нужно отсортировать в обратном порядке, то есть по фамилии, затем по именам и, наконец, по имени.

Заранее спасибо!

var listStr = new[] {
    "Barry John", "Steve Cruthers", "Michael Crab", "David Johnson", "Jonathan Crab", "Jimbo Crab"};

     var sorted = listStr
     .OrderBy(s => s.Split(' ')[1])
     .ThenBy(s => s.Split(' ')[0]);

     foreach (var s in sorted)
     {
         Console.WriteLine(s);
     }
}

1 Ответ

1 голос
/ 28 мая 2019

Проще и эффективнее разделить каждую строку по одному разу, а затем отсортировать по массивам. Наконец, вы можете присоединить массивы обратно к строкам, если хотите.

var sorted = listStr
    .Select(s => s.Split(' ')) // project string to an array
    .OrderBy(a => a[a.Length - 1]) // order by last element
    .ThenBy(a => a.Length > 2 ? a[1] : a[0]) // then order by middle element
    .ThenBy(a => a[0]) // then order by first element
    .Select(a => String.Join(" ", a)); // project back to a string
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...