F#的新手 有一个对象列表。 对象共享相同的基类,但我们要排序的时间戳属性不存在于基类中。 列表中的每个对象都将具有timestamp属性。
要求是按时间戳降序对对象进行排序。
尝试
let sortedList = unsortedList.Sort();
这导致
System.InvalidOperationException:无法比较中的两个元素 数组。 ---> System.ArgumentException:必须至少有一个对象 实现IComparable。在System.Collections.Comparer.Compare(Object a,对象b)
答案 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
访问?
属性,如下所示: