SortedSet <T> и анонимный IComparer <T> в конструкторе не работают

Каким образом анонимные функции работают аргументами на методах, но не в аргументах конструктора?


Если я создаю a List<string>, это имеет Метод сортировки со следующей подписью:

public void Sort(IComparer<T> comparer)

где следующие работы:

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

SortedSet имеет конструктора с подобной подписью:

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() );
17
задан Mikael Svenson 28 June 2010 в 08:17
поделиться

2 ответа

Это потому, что конструктор принимает IComparer (интерфейс), а не Comparison (делегат). Анон-методы / лямбда-выражения могут поддерживать делегаты, но не (напрямую) интерфейсы. Однако обернуть его довольно просто - например:

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) ));
28
ответ дан 30 November 2019 в 10:36
поделиться

В вашем случае List.Sort использует эта подпись

public void Sort(Comparison<T> comparison)

, но не эта

public void Sort(IComparer<T> comparer)
0
ответ дан 30 November 2019 в 10:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: