欲しかったのはDistinctじゃなくてOverだった。

単純な自作クラスだとpublic propertyが全部一致したら同一と見なすみたいな動作ではないのでDistinctでの重複要素の除外ができない。
これが結構厄介で、Tupleや匿名クラスに入れ替えたりしたけどなんかめんどくさいし、Distinctの拡張も考えてみたけどなんか腑に落ちないところがある。
同一と判定するための条件が自由すぎてDistinctと呼べなくなっている。
よくよく考えると本当にやりたいのはDistinctなのかと。
グループ化してグループ毎の最初の要素が欲しいってことなんじゃないかと。
そうか、欲しいのはOver句じゃんと。

■over句

public static class LinqExtensions
{
  public static IEnumerable<T> Over<T, TKey>(this IEnumerable<T> source, Func<T, TKey> partitionerSelector)
  {
    return source.GroupBy(partitionerSelector).Select(x => x.First());
  }
}

■使い方

  var dest = src.Over(x => x.Key);


■2013.05.12 追記
Over句にしては機能弱すぎ。
メソッド名をGroupDistinctに変えようかな。