2010-07-09 61 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) { 
    ... 
}