2014-12-02 31 views
0

F#的新功能 有对象列表。 对象共享相同的基类,但我们想要排序的时间戳属性不在基类中。 列表中的每个对象都将具有timestamp属性。如何按时间戳排序不同类型对象的列表

要求是按时间戳降序排列对象。

试图

let sortedList = unsortedList.Sort(); 

这导致

System.InvalidOperationException:无法比较 两个元件阵列。 ---> System.ArgumentException:至少有一个对象必须实现IComparable。在System.Collections.Comparer.Compare(对象 一,对象B)

回答

2

你没有张贴代码,所以我不能给你确切的代码来解决它。

通常你会在基类或可替换地在接口的属性,但是让我们假设你有这样的:

type A() = class end 

type B(x) = 
    inherit A() 
    member val timestamp = x with get, set 

type C(x) = 
    inherit A() 
    member val timestamp = x with get, set 

let lst = [ new B(5) :> A ; new C(15) :> A; new B(4) :> A ;] 

而且你不能碰这些代码。那么你可以做的是:

let getTimeStamp (x:A) = 
    match x with 
    | :? B as x -> x.timestamp 
    | :? C as x -> x.timestamp 
    | _ -> failwith "subtype not handled" 

lst |> List.sortBy (fun x -> -getTimeStamp x) 

使用反射是另一种可能性(见Mau的答案)。

如果您发布代码示例,我可以给您一个更具体的解决方案并进行测试。

+1

*但时间戳属性,我们想是订购** **不能在基类* – Mau 2014-12-02 09:45:54

+1

本@Mau我错过了那部分,看到更新。 – Gustavo 2014-12-02 10:23:30

相关问题