2009-05-21 1 views
1

次のようなデータ構造が推奨されます。私は3つの主要な特性を持つクラスを持っています。c#の列挙のためのデータ構造格納されるオブジェクトの1つのプロパティで検索されることが多い

public class Example { 

    public Object One { get; } 
    public Object Two { get; } 
    public Object Three { get; } 
} 

別のクラスは、これらのオブジェクトのコレクションが含まれており、頻繁に私はLINQを主に行うたこれらの上に列挙する必要があります。主にプロパティoneの値に基づいてこれらのオブジェクトのサブセットのみをルックアップ/列挙する必要がありますが、私はそのプロパティに基づいて効率的なデータ構造にこれらを格納します。私は私がそこにあるものがわからないよ、私はハッシュテーブルのいくつかの種類を必要と知っているが、C#での前に1を使用したことがないた、

Dictionary<Object,List<Example>> 

しかし、これは非常に非効率的であるとして私を打つ:私は次のような何かを行うことができますつかいます。

いくつかの他の要件/ノート:

  • すべてのオブジェクトは不変であり、クラスがコンストラクタにしてインスタンス化されます値から計算されているハッシュコード
  • は、複数の項目を格納することができる必要がありますを修正しましたすなわち、
  • が自由コレクションからオブジェクトを追加および削除することができなければならないデータ構造内の同じ「スロット」にプロパティの一つで同じ値(従って、ハッシュコード)を有する

答えて

1

PowerCollections(http://www.codeplex.com/PowerCollections)MultiDictionaryコンテナを持っている - おそらくあなたはそれを試みることができますか?

+0

私はハッシュテーブルクラスを使いました。より多くのベンチマークを行っていて、マイナーなロードパフォーマンスの損失を犠牲にして、これが大幅なルックアップのパフォーマンス向上をもたらすことがわかりました – RobV

2

Indexed LINQがお手伝いします。メモリ内のコレクションを提供しますが、オブジェクトのプロパティをIndexableとして属性付けることで、オブジェクトに対して効率的なクエリを作成することができます。

+0

理論ではうまくいくようですが、保存するクラスの関連プロパティに[Indexable()]を定義するとコンパイルするコードを取得できません – RobV

+0

音が奇妙です - どのようなエラーが発生していますか? –

+0

コンパイルエラーは、IndexSpecificationsを定義するためにIndexable属性を削除していることが判明しました – RobV

0

またはHybridDictionary

+0

MSDNドキュメントへのリンクを含めると便利です。 –

+0

これは実際には複数のアイテムを1つのスロットに格納するという第2の要件を満たしていないので、リストの辞書でもう一度終了します。 – RobV

関連する問題