2010年12月29日水曜日

IsDuplicated拡張メソッド

気が向いたので何となく書いてみました。

public static class Enumerable { public bool IsDuplicated<TSource>( this IEnumerable<TSource> source ) { var keys = new HashSet<TSource>(); return !source.All( keys.Add ); } public bool IsDuplicated<TSource, TKey>( this IEnumerable<TSource> source, Func<TSource, TKey> keySelector ) { var keys = new HashSet<TKey>(); return !source.Select( keySelector ).All( keys.Add ); } }
IsDuplicated() つまり重複があるかどうかを判断する拡張メソッドです。
巷にはDistinct()を使ったりして項目数を数えている方法もありますが、数えるということはIEnumerableを最後まで確認する必要があります。

しかし、重複があるかどうか知りたいだけ、同じものが1ヶ所でもダブっていればそれが知りたい、そんなときに最後まで確認するのは無駄です。IsUnique()でなくIsDuplicated()というメソッド名にしたのもそのためです。どうせダブってるんでしょ? ダブってるなら早く教えてよ、と。

仕組みは簡単。HashSetを使います。HashSet.Add()メソッドは戻り値として重複の有無を教えてくれるのでそれを使います。
更にAll()拡張メソッドは1つでもfalseを見つけると即座に中断して返ってきます。

0 件のコメント: