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