2009-08-10 3 views
0

У меня есть список объектов, которые мне нужно отсортировать по объекту property1, и мне нужно снова отсортировать результирующий список с помощью свойства объекта2 без потери группировки, сделанной при первой сортировке .... для ex: OBJ имеет 2 имя свойства и расположение мне нужно иметь окончательный список объектов, которые были отсортированы с регионом и объектами того же региона должны быть отсортированы по имени ...сортировать список в C#

ответ

3

(Предполагая, что вы не LINQ доступны для вас, что делает это тривиально.)

Если вы посмотрите в MiscUtil, вы найдете два полезных классов: ProjectionComparer и LinkedComparer (IIRC).

ProjectionComparer в основном реализует концепцию «заказ по» LINQ - вы указываете, как преобразовать исходный элемент в значение ключа, а компаратор будет заказывать эти значения ключей.

LinkedComparer принимает два сравнения и возвращает новый компаратор, который сначала использует «первичный» сравнитель, а «вторичный» сравнитель, если значения равны по отношению к первичному.

Создайте два проекционных компаратора (по одному для каждого свойства), а затем связанный компаратор с двумя из них, затем передайте это List<T>.Sort. Дайте мне знать, если вам нужен полный пример кода, но это было бы что-то подобное (с использованием C# 3):

var comparer = new LinkedComparer<Foo> 
    (ProjectionComparer<Foo>.Create(x => x.FirstProperty), 
     ProjectionComparer<Foo>.Create(x => x.SecondProperty)); 

(В C# 2 можно использовать анонимные методы, они просто немного более долго-).

0

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

Итак, вы можете написать класс, который реализует IComparer. Затем, в реализации этого класса, вы пишете код, в котором вы сравниваете 2 объекта с требуемыми свойствами.

Смежные вопросы