2016-09-27 100 views
3

我如何能实现IComparerC#IComparable的IComparer的额外帕拉姆

int CompareTo(object obj)

有附加参数,如

int CompareTo(object obj, Dictionary<int, int> preferences)

喜好是Id字典和NumberOfClicks<int, int>

我想要的是比较e字典中的点击次数为categoryId的内容,

示例Cat 1有3次点击,Cat 2有6次点击。

排序比较 preferences[this.CategoryId].value > preferences[object.CategoryId].value

所以他们按类别排序,但相对于Dictionary

+0

您显示的签名来自“IComparable”,而不是“IComparer”。 – dasblinkenlight

回答

5

您不能将额外参数传递给IComparerCompare方法,因为方法签名必须与接口中的签名匹配。

你可以做什么是构造IComparer实例,其额外的参数,它存储在实例,使用内部CompareTo需要:

class MyComparer : IComparer<object> { 
    private readonly IDictionary<int, int> preferences; 
    public MyComparer(IDictionary<int, int> preferences) { 
     this.preferences = preferences; 
    } 
    public int Compare(object a, object b) { 
     ... // Perform the comparison with preferences in scope 
    } 
} 
0

创建实现IComparer<T>一个独立的比较器类,而而不是让类型本身实现IComparable,并让它在构造函数中接受Dictionary。比较器可以在比较对象的实例时使用字典。