如何按时间戳排序不同类型对象的列表

时间:2014-12-02 09:31:12

标签: f# f#-interactive

F#的新手 有一个对象列表。 对象共享相同的基类,但我们要排序的时间戳属性不存在于基类中。 列表中的每个对象都将具有timestamp属性。

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

尝试

let sortedList = unsortedList.Sort();

这导致

  

System.InvalidOperationException:无法比较中的两个元素   数组。 ---> System.ArgumentException:必须至少有一个对象   实现IComparable。在System.Collections.Comparer.Compare(Object   a,对象b)

2 个答案:

答案 0 :(得分:2)

你没有发布代码,所以我无法给你确切的代码来解决它。

通常,您将在Base Class中拥有一个属性,或者在Interface中拥有一个属性,但我们假设您拥有此属性:

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 :(得分:0)

您可以使用动态操作符timestamp访问?属性,如下所示:

C#'s 'dynamic' in F#