Эти вопросы включают в себя две различные реализации по существу одного и того же кода.
Сначала, используя делегат для создания метода сравнения, который можно использовать в качестве параметра при сортировке коллекции объектов:
class Foo
{
public static Comparison<Foo> BarComparison = delegate(Foo foo1, Foo foo2)
{
return foo1.Bar.CompareTo(foo2.Bar);
};
}
Я использую вышеуказанное, когда хочу иметь способ сортировки коллекции объектов Foo по-другому, чем предлагает функция CompareTo. Например:
List<Foo> fooList = new List<Foo>();
fooList.Sort(BarComparison);
Во-вторых, используя IComparer:
public class BarComparer : IComparer<Foo>
{
public int Compare(Foo foo1, Foo foo2)
{
return foo1.Bar.CompareTo(foo2.Bar);
}
}
Я использую вышеуказанное, когда хочу сделать двоичный поиск объекта Foo в коллекции объектов Foo. Например:
BarComparer comparer = new BarComparer();
List<Foo> fooList = new List<Foo>();
Foo foo = new Foo();
int index = fooList.BinarySearch(foo, comparer);
Мои вопросы:
- Каковы преимущества и недостатки каждой из этих реализаций?
- Какие еще способы использовать преимущества каждой из этих реализаций?
- Есть ли способ объединить эти реализации таким образом, что мне не нужно дублировать код?
- Могу ли я получить двоичный поиск и альтернативную сортировку, используя только одну из этих реализаций?