Как мне отсортировать следующий список

#c# #.net #sorting #lambda

#c# #.net #сортировка #лямбда

Вопрос:

У меня есть список, называемый кластерами, и в этом списке есть другой список, называемый тегами, который имеет sequenceno.

Как мне отсортировать кластеры, используя максимальное количество seuqenceno из тегов каждого кластера, используя лямбда-выражение в одной строке.

Что-то вроде

 clusters.Sort((a,b) => a.tags......
  

Комментарии:

1. Является ли это «в одной строке» каким-то бизнес-требованием?

Ответ №1:

Не очень эффективное решение (вычисляет O (N log N) максимумов, но выполняется на месте):

 clusters.Sort((a,b) => a.tags.Max(x => x.sequenceno)
                        .CompareTo(b.tags.Max(x => x.sequenceno)));
  

Несколько лучшее решение (вычисляет только O (N) максимумов, но не работает на месте):

 var max = clusters.ConvertAll(c => c.tags.Max(x => x.sequenceno);
clusters = clusters.Select((x,i) => new{x,i})
                   .OrderBy(xi => max[xi.i].CompareTo(max[xi.j]))
                   .Select(xi => xi.x)
                   .ToList();
  

Будет сложно эффективно выполнить эту сортировку на месте без любого:

  1. Добавление свойства к классу cluster для кэширования максимального порядкового номера тегов (и обработки его возможной недействительности, что может быть непросто);
  2. Добавление свойства к классу cluster для отслеживания его индекса (что может не иметь смысла в нем, а также может вызвать проблемы с недействительностью);
  3. Используя список оболочек вокруг кластеров, которые отслеживают любое из значений, упомянутых в 1 и 2;
  4. Создайте свой собственный алгоритм сортировки.

Комментарии:

1. Верно, но перед оптимизацией убедитесь, что проблема с производительностью действительно существует… Если списки тегов не слишком велики, я бы не стал беспокоиться.

2. Решение на месте отлично работает, потому что проблемы с проверкой уже решены. Также списки тегов довольно маленькие. Спасибо!

3. @jeroenh: Именно. Я конкретно упомянул, какая часть была неэффективной, и насколько неэффективной она была, чтобы упростить принятие решения.

Ответ №2:

используя LINQ OrderBy:

  var orderedClusters = clusters.OrderBy(list => list.Max(item => item.SequenceNo))