Как отсортировать список объектов по переменной, которая не является частью объекта? - PullRequest
1 голос
/ 16 марта 2012

Рассмотрим следующий псевдокод:

List<Person> People = new List<Person>();
int score;

...

foreach (Person p in People){

score = scoreFunc(p);

???

}

Вопрос - как можно отсортировать список объектов Person по количеству баллов? В случае, если вам интересно, я бы не хотел делать счет личностью, потому что она будет отличаться для одного и того же лица в разных обстоятельствах и логически не является собственностью человека.

1 Ответ

5 голосов
/ 16 марта 2012

Сортировка происходит с использованием делегата / класса, который может сравнивать двух человек - вам не нужно сравнивать их по одному атрибуту. Например

People.Sort((p1,p2)=>scoreFunc(p1)-scoreFunc(p2));

EDIT:

Если вы хотите отсортировать весь список по количеству баллов, то это будет единственный способ (вы можете изменить алгоритм сортировки, но сравнение не изменится, потому что счет - это ключ сортировки). Теперь выше, вероятно, будет вычислять счет для некоторых людей несколько раз - поэтому одной из оптимизаций может быть кэширование оценки человека. Например, ScoreFunc может проверить в кэше (словаре), чтобы увидеть, была ли оценка уже вычислена или нет.

Дальнейшая оптимизация может происходить на основе ваших реальных требований и реализации функции скоринга. Например, предположим, что у вас есть 10000 человек, и вы, вероятно, интересуетесь топ-20. Предположите, что возраст и образовательные квалификации этого человека составляют основную часть баллов, в то время как есть 20 других атрибутов, которые вносят незначительный вклад. Таким образом, вы можете выполнить многопроходную сортировку - первый проход может использовать оценку, основанную только на двух факторах, для определения, скажем, 500 лучших, а затем вы применяете подробный подсчет, чтобы получить реальный 20 лучших.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...