具有值实现接口的字典的扩展方法

Extension method for dictionary with value implementing interface

我正在尝试为所有字典实现一个扩展方法,这些字典的值属于实现特定接口的类型。 在这种情况下,我想要一个 returns

的 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 的 class,那么它将起作用。

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

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

基本上你需要使方法在值类型上通用,然后将该类型约束为 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();
}