Перегрузка List.Sort - PullRequest
       13

Перегрузка List.Sort

0 голосов
/ 26 августа 2011

У меня есть List(Of MyObject), который мне нужно отсортировать. Поэтому я убедился, что реализованы IComparable, IEquatable, IEqualityComparer и IComparer, и сортировка работает отлично.

Появилось новое новое требование для проекта. Сортированный список не может содержать «дубликаты» объектов. Дубликат в этом случае немного отличается от того, как дубликат определяется для целей сортировки. Я создал новую подпрограмму, которая проверит два объекта и вернет предпочтительный. Предпочтительным является тот, у которого все значения одинаковы, кроме одного, и последнее значение является наибольшим. У меня эта рутина работает хорошо.

Теперь я хотел бы решить эту проблему «удаления дубликатов», создав объект, который наследует IList(Of MyObject), а затем переопределив метод Sort, чтобы сначала удалить «дубликаты», а затем отсортировать, используя интерфейс IComparable как List обычно сортирует себя. Тем не менее, я понятия не имею, как это сделать. Это даже не кажется возможным из того, что я прочитал до сих пор. Я знаю, что могу решить эту проблему, просто создав отдельную подпрограмму типа SortWithRemove или что-то в этом роде, но мне было интересно, возможно ли переопределение.

Редактировать: Исходя из приведенных ниже предложений, я решил не переопределять Sort, а использовать метод расширения. Вот мой код:

Public Module Extensions

    <System.Runtime.CompilerServices.Extension()> _
    Public Sub SortRemovingDuplicates(list As List(Of UniCatalogEntry))
        'filter out unwanted records
    End Sub

End Module

Ответы [ 2 ]

3 голосов
/ 26 августа 2011

Не изменяйте семантику List.Sort (я предполагаю, что вы имеете в виду это, а не IList.Sort, которого не существует).Если вы это делаете, вы нарушаете контракт метода.

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

1 голос
/ 26 августа 2011

Может иметь смысл создать метод расширения для обработки сортировки и удаления дубликатов.

public static class Extensions
{
    public static void SortAndRemoveDuplicates<T>(this IList<T> list) where T is IComparable
    {
        // add magic here...
    }
}
...