2010-07-09 50 views
1

假设我要在字典中,它们的值进行排序返回键列表的方法:如何引用默认的IComparer在一个自定义字典值排序

/// Perhaps a wildly inefficient way to achieve this! 
public static List<K> SortByValues<K,V>(Dictionary<K,V> items) 
{ 
    var keys = new K[items.Count]; 
    var values = new V[items.Count]; 
    var index = 0; 

    foreach(var kvp in items) 
    { 
     keys[index] = kvp.Key; 
     values[index++] = kvp.Value; 
    } 

    Array.Sort(values, keys); 

    return new List<K>(keys); 
} 

我想提供一个接受过载一个IComparer传递给Array.Sort方法。有没有办法做到这一点,而不重复所有的代码?理想情况下,可以通过某种方式来获得类型V的“默认”比较器。

回答

1

Comparer<V>.Default,也许?

你可以只改变SortByValues采取的IComparer<V>参数,然后有一个重载调用方法传递Comparer<V>.Default

public static List<K> SortByValues<K,V>(Dictionary<K,V> items) 
{ 
    SortByValues(items, Comparer<K>.Default); 
} 

public static List<K> SortByValues<K,V>(Dictionary<K,V> items, IComparer<K> comparer) 
{ 
    var keys = new K[items.Count]; 
    var values = new V[items.Count]; 
    var index = 0; 

    foreach(var kvp in items) 
    { 
    keys[index] = kvp.Key; 
    values[index++] = kvp.Value; 
    } 

    Array.Sort(values, keys, comparer); 

    return new List<K>(keys); 
} 
+0

就是这样,感谢您的参考。 – 2010-07-09 23:06:59

0

看起来您正试图发现获取给定通用参数V的默认值IComparer<V>的方法。如果是这样,那么你正在寻找Comparer<T>.Default财产(或如果做直等于EqualityComparer<T>)。

有了它,您可以使用以下模式接受自定义比较器。

public static List<K> SortByValues<K,V>(Dictionary<K,V> items) { 
    return SortByValues(items, Comparer<V>.Default); 
} 

public static List<K> SortByValues<K,V>( 
    Dictionary<K,V> items, 
    IComparer<V> comparer) { 
    ... 
}