我有一堆类,每个类都有一个名为Sequence的属性。此属性是从名为ISequenced的接口实现的。对于此示例,我们可以调用其中一个类A.
当我有一个List(A)时,我希望能够使用标准List.Sort(addressof委托)对它们进行排序,其中委托是一个标准函数,它接收两个ISequenced对象并比较它们的序列号并返回一个布尔值标志,而不是为实现ISequenced的每个单独的类声明一个函数。
E.g。
Dim li as List(of A) = GetValues()
li.Sort(addressof SortBySeq)
...
Public Function SortBySeq(ByVal ob1 as ISequenced, ByVal ob2 as ISequenced) as Boolean
return ob1.Sequence.CompareTo(ob2.Sequence)
End If
编辑:使用上面的代码给出了以下错误:
“重载解析失败,因为没有 可以调用可访问的“排序” 这些论点: 'Public Sub Sort(比较为System.Comparison(Of A))':选项 Strict On不允许缩小范围 隐式类型之间的转换 方法'Public Function SortBySeq(ob1 如ISequenced,ob2 As ISequenced)As 整数'和委托'代表 函数比较(A)(x As A,y As A)作为整数'。 'Public Sub Sort(比较作为System.Collections.Generic.IComparer(Of。) A))':'AddressOf'表达式不能 转换成 “System.Collections.Generic.IComparer(中 A)'因为 “System.Collections.Generic.IComparer(中 A)'不是代表类型。“
我如何声明该功能才能执行此操作(如果甚至可以在VB.NET中使用?
谢谢, 戴恩。
答案 0 :(得分:1)
实施IComparer。您需要的一切都是here。
编辑: 哦,我明白了什么。具有Sequence属性的所有类必须实现可比较的接口。例如。使用IHaveSequence并执行IComparer< IHaveSequence取代。 IHaveSequence的定义应该是显而易见的。
答案 1 :(得分:0)
最后不需要实现IComparer,因为我只是比较小数。事实证明,.NET 3.5至少增加了一些代理人的协方差能力,所以我已升级到那个,我上面给出的例子似乎工作正常。