вы знаете, область значений, которые вы хотите сравнивать? То есть, знаете ли вы, что они будут «ccc», «yyy» и «aaa» (или, может быть, другие значения, но все возможные значения известны заранее)?
Если ответ «Да», я бы подумал об использовании Словаря, где ключи являются вашими известными значениями, а значения представляют собой порядок. Затем в реализации Compare верните значение для каждой входной строки и верните результат их сравнения.
Извините, мой бедный VB, поскольку я не использую VB.Net, и я не хотел просто публиковать версию C#. Я думаю, вы можете получить эту идею. По существу, вы создаете таблицу поиска, которая отображает ваши известные строки в «порядковое» значение каждой строки (или ее позицию в наборе всех известных строк). Во время сравнения MyClass получите значение Prop1 (поскольку это похоже на то, что вы хотите сравнить) из каждого из двух экземпляров MyClass, которые сравниваются. Преобразуйте каждое значение String в Integer, просмотрев строку в словаре. Затем вы можете вычесть одно целое из другого, чтобы получить результат сравнения.
Некоторые вещи, чтобы рассмотреть следующие вопросы:
Вы хотите, чтобы ваше сравнение будет чувствительно к регистру (т.е. "ааа" == "AAA"). Если это так, вы, вероятно, захотите использовать нечувствительный к регистру словарь.
Вы можете сравнить (если не требуется регистр) строковые свойства двух объектов, которые нужно сравнить, и, если они равны, просто вернуть 0. Не нужно сначала преобразовывать значения String в Integer.
Возможно, вам стоит подумать о том, что произойдет, если один из (или обоих) экземпляров MyClass будет сравнивать значение, которое не находится в словаре (если это может произойти).
Возможно, вам понадобится специальная обработка, если свойство 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
Да, я знаю область значений Dim myList() As String = {"ccc", "yyy", "aaa"} –