5

確かに、値のコレクションに重複がないことを確認する簡単な方法があります[のデフォルトを使用して] ComparisonC #/.NET ? 直接組み込む必要はありませんが、短く効率的なものにする必要があります。collectionType

私は多くのことを調べてきましたが、collection.Count() == collection.Distinct().Count()私にとって非効率的な使用例を挙げ続けています。私は結果に興味がなく、重複を検出したらすぐに救済したいと考えています。

(誰かが重複を指摘できる場合は、この質問および/またはその回答を削除したいと思います)

4

2 に答える 2

9

わかりました、重複が見つかったらすぐに出たいだけなら、それは簡単です:

// TODO: add an overload taking an IEqualityComparer<T>
public bool AllUnique<T>(this IEnumerable<T> source)
{
    if (source == null)
    {
        throw new ArgumentNullException("source");
    }
    var distinctItems = new HashSet<T>();
    foreach (var item in source)
    {
        if (!distinctItems.Add(item))
        {
            return false;
        }
    }
    return true;
}

... またはAll、既に示したように を使用します。この場合、これは少し理解しやすいと思います...または、を使用Allたい場合は、明確にするために、少なくともセットの作成をメソッドグループの変換から分離します。

public static bool IsUnique<T>(this IEnumerable<T> source)
{
    // TODO: validation
    var distinctItems = new HashSet<T>();
    // Add will return false if the element already exists. If
    // every element is actually added, then they must all be unique.
    return source.All(distinctItems.Add);
}
于 2013-07-18T11:27:59.597 に答える
7

インラインで行うと、次のものを置き換えることができます。

collection.Count() == collection.Distinct().Count()

collection.All( new HashSet<T>().Add );

Tコレクションの要素のタイプはどこにありますか)

または、上記をヘルパー拡張メソッド [1] に抽出して、次のように言うことができます。

collection.IsUnique()

[1]

static class EnumerableUniquenessExtensions
{
    public static bool IsUnique<T>(this IEnumerable<T> that)
    {
        return that.All( new HashSet<T>().Add );
    }
}

(そして、ジョンが彼の答えで指摘したように、そのような「かわいさ」は一般的に良い考えではないので、実際には2行を分けてコメントする必要があります)

于 2013-07-18T11:20:37.620 に答える