如何在自定义词典值排序中引用默认IComparer

时间:2010-07-09 22:51:33

标签: c# generics

假设我有一个方法来返回字典中的键列表,按其值排序:

/// 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型的“默认”比较器。

2 个答案:

答案 0 :(得分: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 ); 
} 

答案 1 :(得分:0)

您似乎正在尝试找到获取给定通用参数IComparer<V>的{​​{1}}的默认值的方法。如果是这样,那么您正在寻找V属性(如果直接相等则为Comparer<T>.Default)。

通过它,您可以使用以下模式来接受自定义比较器。

EqualityComparer<T>