1. ホーム
  2. .net

[解決済み] List<T>.Contains() がとても遅い?

2023-01-10 11:18:24

質問

どなたか、なぜジェネリックスの List.Contains() 関数がとても遅い理由を教えてください。

私は List<long> に約100万個の数字があり、これらの数字の中に特定の数字があるかどうかを常にチェックしているコードです。

を使って同じことをやってみました。 Dictionary<long, byte>Dictionary.ContainsKey() 関数を使用した場合、Listを使用した場合よりも10~20倍程度速くなりました。

もちろん、Dictionaryはそのような使い方を想定していないので、本当は使いたくありません。

ということで、ここでの本当の疑問は List<T>.Contains() のような奇抜なものではなく Dictionary<K,V>.ContainsKey() ?

どのように解決するのですか?

存在だけを確認する場合 HashSet<T> は、辞書のようなパフォーマンスで、キー/値のペアはなく、値だけです。

    HashSet<int> data = new HashSet<int>();
    for (int i = 0; i < 1000000; i++)
    {
        data.Add(rand.Next(50000000));
    }
    bool contains = data.Contains(1234567); // etc