Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 如何按时间戳对不同类型对象的列表进行排序_F#_F# Interactive - Fatal编程技术网

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

F# 如何按时间戳对不同类型对象的列表进行排序,f#,f#-interactive,F#,F# Interactive,F的新成员# 有一个对象列表。 对象共享相同的基类,但基类上不存在我们要按其排序的timestamp属性。 列表中的每个对象都将具有timestamp属性 需求是按时间戳降序排列对象 企图 let sortedList = unsortedList.Sort(); 这导致 System.InvalidOperationException:无法比较中的两个元素 数组。-->System.ArgumentException:必须至少有一个对象 实现IComparable。位于System.Coll

F的新成员# 有一个对象列表。 对象共享相同的基类,但基类上不存在我们要按其排序的timestamp属性。 列表中的每个对象都将具有timestamp属性

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

企图

let sortedList = unsortedList.Sort();
这导致

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


你没有发布代码,所以我不能给你确切的代码来解决它

通常,您将在基类或接口中拥有一个属性,但假设您拥有:

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的答案)


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

您可以使用动态运算符
访问
时间戳属性,如下所示:

但是我们想要按其排序的timestamp属性在基类上不存在