具有值实现接口

时间:2018-02-22 16:23:25

标签: c# dictionary interface extension-methods

我尝试为所有字典实现扩展方法,其值是实现某个接口的类型。 在这种情况下,我想要一个返回

的ToListSortedByValue()方法
List<KeyValuePair<string, IComparable>> 

任何类型的字典

Dictionary<string, IComparable>

这很酷,因为它允许我使用字典而不是列表,但是能够在需要时对它们进行排序(例如在文件或控制台中打印时)。

这是我尝试过的,但它不起作用,任何想法为什么?

public static List<KeyValuePair<string, IComparable>> ToListSortedByValue(this Dictionary<string, IComparable> Dic)
{
    return Dic.OrderBy(x => x.Value).ToList();
}

编辑: 它已经解决了,但为了完整起见,这是我得到的问题: 当我尝试使用这种方法时,我得到了一个错误,就好像这种方法不存在一样。如果不使用IComparable而是使用实际的可比较类型,那么让我们说int或实现IComparable的类比它可以工作的那样。

2 个答案:

答案 0 :(得分:0)

您需要使您的方法具有通用性,以便它扩展您的实际类型,而不仅仅是IComparable

public static List<KeyValuePair<string, T>> ToListSortedByValue<T>(this Dictionary<string, T> Dic) where T : IComparable<T>

答案 1 :(得分:0)

基本上你需要在值类型上使方法通用,然后将该类型约束为IComparable<T>

public static List<KeyValuePair<string, T>> ToListSortedByValue<T>(
    this Dictionary<string, T> Dic) where T : IComparable<T>
{
    return Dic.OrderBy(x => x.Value).ToList();
}

这有额外的好处,就是在传递类型时返回值。您甚至可能希望将密钥类型设为通用,因此它不仅限于string

public static List<KeyValuePair<TKey, TValue>> ToListSortedByValue<TKey, TValue>(
    this Dictionary<TKey, TValue> Dic) where TValue : IComparable<TValue>
{
    return Dic.OrderBy(x => x.Value).ToList();
}