Vantagens / Desvantagens de diferentes implementações para comparar objetos

Esta pergunta envolve 2 implementações diferentes essencialmente do mesmo código.

Primeiro, usando delegate para criar um método Comparison que pode ser usado como parâmetro ao classificar uma coleção de objetos:

class Foo
{
    public static Comparison<Foo> BarComparison = delegate(Foo foo1, Foo foo2)
    {
        return foo1.Bar.CompareTo(foo2.Bar);
    };
}

Eu uso o descrito acima quando quero ter uma maneira de classificar uma coleção de objetos Foo de uma maneira diferente da oferecida pela minha função CompareTo. Por exemplo:

List<Foo> fooList = new List<Foo>();
fooList.Sort(BarComparison);

Segundo, usando o IComparer:

public class BarComparer : IComparer<Foo>
{
    public int Compare(Foo foo1, Foo foo2)
    {
        return foo1.Bar.CompareTo(foo2.Bar);
    }
}

Eu uso o descrito acima quando quero fazer uma pesquisa binária de um objeto Foo em uma coleção de objetos Foo. Por exemplo:

BarComparer comparer = new BarComparer();
List<Foo> fooList = new List<Foo>();
Foo foo = new Foo();
int index = fooList.BinarySearch(foo, comparer);

Minhas perguntas são:

Quais são as vantagens e desvantagens de cada uma dessas implementações?Quais são mais algumas maneiras de tirar proveito de cada uma dessas implementações?Existe uma maneira de combinar essas implementações de forma que eu não precise duplicar o código?Posso obter uma classificação de pesquisa binária e uma coleção alternativa usando apenas 1 dessas implementações?

questionAnswers(5)

yourAnswerToTheQuestion