2015-01-21 2 views
1

У меня есть список (из Myclass) Я хочу сортировать по свойству в моем классе (p propriety AS String) и в соответствии с заданными значениями Dim myListeValues ​​() AS String = { «ссс», «ууу», «ааа»} Я хочу использовать интерфейс IComparer как:Использование ICOMPARER для VB.NET

Public Class MyClass 
    Public Property p As String 

я хочу сделать:

Private Class MyComparer Implements Icomparer(of MyClass) 
Public Function Compare(x AS MyClass) AS Integer Implements IComparer (Of MyClass).Compare 

      Return ???? 


    i want this order : 1) x.p = "ccc" 
        2) x.p = "yyy" 
        3) x.p = "aaa" 


End FunctionEnd Class 


how can I do that? 

ответ

0

вы знаете, область значений, которые вы хотите сравнивать? То есть, знаете ли вы, что они будут «ccc», «yyy» и «aaa» (или, может быть, другие значения, но все возможные значения известны заранее)?

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

Извините, мой бедный VB, поскольку я не использую VB.Net, и я не хотел просто публиковать версию C#. Я думаю, вы можете получить эту идею. По существу, вы создаете таблицу поиска, которая отображает ваши известные строки в «порядковое» значение каждой строки (или ее позицию в наборе всех известных строк). Во время сравнения MyClass получите значение Prop1 (поскольку это похоже на то, что вы хотите сравнить) из каждого из двух экземпляров MyClass, которые сравниваются. Преобразуйте каждое значение String в Integer, просмотрев строку в словаре. Затем вы можете вычесть одно целое из другого, чтобы получить результат сравнения.

Некоторые вещи, чтобы рассмотреть следующие вопросы:

  1. Вы хотите, чтобы ваше сравнение будет чувствительно к регистру (т.е. "ааа" == "AAA"). Если это так, вы, вероятно, захотите использовать нечувствительный к регистру словарь.

  2. Вы можете сравнить (если не требуется регистр) строковые свойства двух объектов, которые нужно сравнить, и, если они равны, просто вернуть 0. Не нужно сначала преобразовывать значения String в Integer.

  3. Возможно, вам стоит подумать о том, что произойдет, если один из (или обоих) экземпляров MyClass будет сравнивать значение, которое не находится в словаре (если это может произойти).

  4. Возможно, вам понадобится специальная обработка, если свойство String одного или обоих объектов является нулевым или пустым.

Удачи вам!

Private Class MyComparer Implements IComparer(of MyClass) 
    Private Dictionary dict = new Dictionary of (String, Integer) (System.StringComparer.OrdinalIgnoreCase) 

    Private Sub New() 
     dict.Add("ccc", 0) 
     dict.Add("yyy", 1) 
     dict.Add("aaa", 2) 
    End Sub 

    Public Function Compare(x AS MyClass, y AS MyClass) AS Integer Implements IComparer (Of MyClass).Compare 

     Boolean xb = String.IsNullOrWhitespace(x.Prop1) 
     Boolean yb = String.IsNullOrWhitespace(y.Prop1) 

     If xb And !yb Then Return -1 'x.Prop1 null or empty, y.Prop1 has a value 
     If !xb And yb Then Return 1 'x.Prop1 has a value, y.Prop1 has a value 

     If String.Compare(x.Prop1, y.Prop1, StringComparison.OrdinalIgnoreCase) = 0 Then Return 0 

     Integer xi = dict[x.Prop1] 
     Integer yi = dict[y.Prop1] 

     Return xi - yi 
    End Function 
End Class 
+0

Да, я знаю область значений Dim myList() As String = {"ccc", "yyy", "aaa"} –

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