欲しかったのは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に変えようかな。