IComparable - вызывать разные сорта? - PullRequest
0 голосов
/ 17 августа 2010

У меня есть DTO, который я использую для обработки транзакций.Чтобы убедиться, что он обрабатывается в правильном порядке, я использую iComparable и сортирую список (из T) DTO.Это прекрасно работает.Однако я просто получил еще одно требование, чтобы клиент хотел выводить в другом порядке ... есть ли способ разрешить мне иметь два разных вида сортировки для одного и того же объекта, или мне нужно скопировать текущий класс, сохранить выводновый список этого типа и сортировки, используя новый способ для этого объекта?Похоже, ужасный способ сделать это, но не могу найти ничего, что позволило бы мне сделать это.

Ответы [ 2 ]

2 голосов
/ 17 августа 2010

Вот пример, который я скопировал из недавнего проекта. Работает как шарм. Просто не забудьте вызвать SORT с соответствующей функцией. Это выходит за рамки интерфейса IComparable, поэтому вы можете удалить его из объявления класса.

Public Class Purchaser
....
Public Shared Function CompareByGroup( _
   ByVal x As Purchaser, ByVal y As Purchaser) As Integer

   If x Is Nothing Then
     If y Is Nothing Then
       ' If x is Nothing and y is Nothing, they're equal. 
       Return 0
     Else
       ' If x is Nothing and y is not Nothing, y is greater. 
       Return -1
     End If
   Else
     If y Is Nothing Then
       ' If x is not Nothing and y is Nothing, x is greater. 
       Return 1
     Else
       ' ...and y is not Nothing, compare by GroupName.
       Return x.GroupName.CompareTo(y.GroupName)
     End If
    End If
  End Function

  Public Shared Function CompareByName( _
    ByVal x As Purchaser, ByVal y As Purchaser) As Integer

    ... 'you get the idea
  End Function

И назовите их вот так ...

tempList.Sort(AddressOf Classes.Purchaser.CompareByGroup)

или

tempList.Sort(AddressOf Classes.Purchaser.CompareByName)
0 голосов
/ 17 августа 2010

Или вы можете использовать linq, если вы используете .Net 3.5 или выше.

dim orderedlistofdtos = (from e in listofdtos order by e.whatever select e).Tolist
...