2012-01-11 6 views
1

私はDictionary<long, object>のkeyCollectionを使用するクラスを持っています。私は他のクラスにキーだけを渡したいと思います。アクセス速度を維持している辞書のKeyCollectionを継承する

私は辞書がtheorical O(1)アクセス・バイ・インデックス(HashTableなど)を持っていることを知っているが、私はリストにkeyCollectionを変換する場合、アクセスがO(n)に変更します。

O(1)をアクセスしているクラスにkeyCollectionを渡すにはどうすればよいですか?

EDIT:私は.NET 2.0を使用しています。

ありがとうございます。

+0

定義...あなたは「インデックスによって読み取ら」を意味ならば、アクセスは確かにO(1)のままで、この上Contains(key)の実装はO(1)、それが実装されているので、経由でハッシュテーブルよりも高速* O(1)でなければなりません。実際、O(1)はキーによるアクセス**にのみ適用されます**キーのリスト**では意味がありません** - あなたはそのリストで何をしたいですか? –

+0

@MarcGravell:はい、私はインデックス(.Contains())でアクセスします。 –

+0

@MarcGravell:辞書に特定のキー値が含まれているかどうかを知るためにキーコレクションが必要です。 –

答えて

4

コメントには、ここにあなたの意図が.Contains()と記載されています。その場合、探しているものはHashSet<T>です。これはちょうどキー(値なし)を保持し、速いContainsのチェックを提供します。そう; Dictionary<long,object>の場合は、

var set = new HashSet<long>(dictionary.Keys); 

とすることができます。便宜上、HashSet<T>ICollection<T>を実装しています(具体的なタイプではなくインターフェイスにスコープしたい場合) - Containsもあります。

実際には、(また、.NET 2.0で動作する)を使用する方が効率的であり得る。

ICollection<long> = dictionary.Keys; 

及びそれを渡します。 「アクセス」を

bool ICollection<TKey>.Contains(TKey item) 
{ 
    return this.dictionary.ContainsKey(item); 
} 
+0

そして、あなたがクラスを制御していると仮定すると、実際に 'HashSet 'ではなく 'ISet 'を受け入れるべきです。 (キーセットを辞書にコピーしなくて済むようにするには、辞書を取り、 'ISet 'メソッドを実装するラッパークラスを作成することができます)。 – porges

+0

ありがとう、それはまさに私が求めていたものです。ありがとう。 –

+0

@Porges 'ISet 'はこのケースでは多くの便利なメソッドを提供していません。実際には 'ICollection '(これは 'ISet ')が役に立ちます。 –

関連する問題