C#の:IEnumerableを .HasDuplicatesの良いと効率的な実装
-
16-09-2019 - |
質問
誰もが項目の順序が任意の重複を持っている場合は見つけるための良いと効率的な拡張メソッドを持っていますか?
私は拡張メソッドにreturn subjects.Distinct().Count() == subjects.Count()
を置くことができると思いますが、種類のより良い方法があるはずと感じています。その方法は、二度の要素をカウントし、すべてのdistict要素を整理する必要があります。より良い実装は、最初に見つかった重複にtrueを返す必要があります。どれでも良い提案?
私は輪郭がこのようなものかもしれないと想像します
public static bool HasDuplicates<T>(this IEnumerable<T> subjects)
{
return subjects.HasDuplicates(EqualityComparer<T>.Default);
}
public static bool HasDuplicates<T>(this IEnumerable<T> subjects, IEqualityComparer<T> comparer)
{
...
}
しかし、かなり確実ではない、それのスマートな実装が可能だろうか...
解決
public static bool HasDuplicates<T>(this IEnumerable<T> subjects)
{
return HasDuplicates(subjects, EqualityComparer<T>.Default);
}
public static bool HasDuplicates<T>(this IEnumerable<T> subjects, IEqualityComparer<T> comparer)
{
HashSet<T> set = new HashSet<T>(comparer);
foreach (T item in subjects)
{
if (!set.Add(item))
return true;
}
return false;
}
他のヒント
このは、生産コードです。素晴らしい作品ます:
public static bool HasDuplicates<T>(this IEnumerable<T> sequence) {
var set = new HashSet<T>();
return !sequence.All(item => set.Add(item));
}
私は、最も単純な拡張メソッドは次のようだと思います。
public static bool HasDuplicates<T>(this IEnumerable<T> enumerable) {
var hs = new HashSet<T>();
foreach ( var cur in enumerable ) {
if ( !hs.Add(cur) ) {
return false;
}
}
}
所属していません StackOverflow