使用ICOMPARER for VB.NET

时间:2015-01-21 20:06:31

标签: .net vb.net icomparer

我有一个(Myclass)列表  我想根据订单确定的值对我班级中的某个属性(p propriety AS String)进行排序  Dim myListeValues()AS String = {“ccc”,“yyy”,“aaa”}  我想将IComparer接口用作:

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?

1 个答案:

答案 0 :(得分:0)

您是否知道要比较的值的域?也就是说,你知道它们会是“ccc”,“yyy”和“aaa”(或者是其他值,但所有可能的值都是提前知道的)?

如果答案为是,那么我会考虑使用一个字典,其中键是您的已知值,值代表顺序。然后,在Compare实现中,检索每个输入字符串的值并返回比较它们的结果。

请原谅我可怜的VB,因为我不使用VB.Net而且我不想只发布一个C#版本。我想你可以得到这个想法。基本上,您创建的查找表将已知字符串映射到每个字符串的“序数”值(或其在所有已知字符串集中的位置)。在比较MyClass期间,从正在比较的两个MyClass实例中的每一个获取Prop1的值(因为这看起来像您要比较的内容)。通过在字典中查找字符串将每个String值转换为Integer。然后,您可以从另一个中减去一个Integer以获得比较结果。

需要考虑的一些事项:

  1. 您希望您的比较不区分大小写(即“aaa”==“AAA”)。如果是这样,您可能希望使用不区分大小写的字典。

  2. 您可以比较(必要时不区分大小写)要比较的两个对象的字符串属性,如果相等,则只返回0.无需先将String值转换为Integer。

  3. 您可能想要考虑如果所比较的MyClass实例中的一个(或两个)具有不在字典中的值(如果可能发生这种情况)会发生什么。

  4. 如果一个或两个对象的String属性为null或为空,则可能需要一些特殊处理。

  5. 祝你好运!

    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