代码之家  ›  专栏  ›  技术社区  ›  Mikael Svenson

构造函数中的SortedSet<T>和匿名IComparer<T>不起作用

  •  17
  • Mikael Svenson  · 技术社区  · 14 年前


    如果我创建一个 List<string>

    public void Sort(IComparer<T> comparer)
    

    以下工作:

    List<string> list = new List<string>();
    list.Sort( (a,b) => a.CompareTo(b) );
    

    public SortedSet(IComparer<T> comparer)
    

    SortedSet<string> set = new SortedSet<string>( (a, b) => a.CompareTo(b) );
    

    创建排序类的工作正常:

    public class MyComparer : IComparer<string>
    {
        public int Compare(string a, string b)
        { return a.CompareTo(b); }
    }
    
    SortedSet<string> set = new SortedSet<string>( new MyComparer() );
    
    4 回复  |  直到 14 年前
        1
  •  30
  •   Marc Gravell    14 年前

    the constructor 接受 IComparer<T> Comparison<T>

    class FuncComparer<T> : IComparer<T>
    {
        private readonly Comparison<T> comparison;
        public FuncComparer(Comparison<T> comparison) {
            this.comparison = comparison;
        }
        public int Compare(T x, T y) {
            return comparison(x, y); }
    }
    

    现在您可以使用:

    SortedSet<string> set = new SortedSet<string>(
          new FuncComparer<string>( (a, b) => a.CompareTo(b) ));
    
        2
  •  31
  •   Phil Klein    10 年前

    Comparer<T>.Create :

    var set = new SortedSet<string>(
        Comparer<string>.Create((a, b) => a.CompareTo(b)));
    
        3
  •  3
  •   Jiping    7 年前

    SortedSet接受接口而不是委托的解释很好(但Java接受)。

    正因为如此,.Net提供了一个工厂方法来创建这样的对象,所以您不需要为此定义新的类。

    var set = new SortedSet<string>( 
        Comparer<string>.Create((a, b) => a.CompareTo(b))
    );
    
        4
  •  0
  •   Denis Palnitsky    14 年前

    我知道你的病例表。排序使用这个签名

    public void Sort(Comparison<T> comparison)
    

    但不是这个

    public void Sort(IComparer<T> comparer)