#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();
Будет сложно эффективно выполнить эту сортировку на месте без любого:
- Добавление свойства к классу cluster для кэширования максимального порядкового номера тегов (и обработки его возможной недействительности, что может быть непросто);
- Добавление свойства к классу cluster для отслеживания его индекса (что может не иметь смысла в нем, а также может вызвать проблемы с недействительностью);
- Используя список оболочек вокруг кластеров, которые отслеживают любое из значений, упомянутых в 1 и 2;
- Создайте свой собственный алгоритм сортировки.
Комментарии:
1. Верно, но перед оптимизацией убедитесь, что проблема с производительностью действительно существует… Если списки тегов не слишком велики, я бы не стал беспокоиться.
2. Решение на месте отлично работает, потому что проблемы с проверкой уже решены. Также списки тегов довольно маленькие. Спасибо!
3. @jeroenh: Именно. Я конкретно упомянул, какая часть была неэффективной, и насколько неэффективной она была, чтобы упростить принятие решения.
Ответ №2:
используя LINQ OrderBy:
var orderedClusters = clusters.OrderBy(list => list.Max(item => item.SequenceNo))