1

次のインターフェイスを持つオブジェクトのコレクションがあります。

public IEntity
{
    public string Key1 { get; set; }
    public string Key2 { get; set; }
    ... some other properties
}

linq を介してこれらのオブジェクトのメモリ内コレクションをクエリするための最良の戦略を探しています。ほとんどのクエリ (すべてではない) は、エンティティにアクセスするために Key1 または Key2 を探す可能性が高いため、それらをクエリする最もパフォーマンスの高い方法が何であるかはわかりません。私の考えは次のとおりです。

IList< IEntity>

それらをリストに貼り付け、linqを使用してそれらをフィルタリングするだけです

IDictionary< Tuple< 文字列, 文字列>, IEntity>

key1 と key2 を使用してマルチキー ディクショナリを作成しますが、1 つの部分しか知らない場合に IEntity にアクセスする方法がわかりません。

他の何か

これを達成するための他のより良い方法はありますか?

4

4 に答える 4

2

キーに基づく高速ルックアップでは、連想コンテナーよりも優れた機能はありません。 のようなハッシュテーブルDictionaryまたは のようなツリーベースの構造SortedDictionaryです。データ構造がソートされた入力から一度構築され、めったに変更されないという比較的まれなケースでは、 も考慮してSortedListください。これらはすべて異なるパフォーマンス特性を持っているため、選択は詳細に依存します。

キーのタイプが異なる場合は、実際にはそのようなコンテナーを複数使用する必要がありますが、ここでは単純に 1 つだけを使用して、各「キーのタイプ」に一意のプレフィックスを付けることができます。たとえば、次のようにすることができます。

var dict = new Dictionary<string, IEntity>();
var entity = (IEntity)whatever;

dict.Add("key1:" + entity.Key1, entity);
dict.Add("key2:" + entity.Key2, entity);

// and now find by either Key1 or Key2 by using the same prefix

キーが一意であることが保証されていない場合は、「MultiDictionary」または同等のクラスが必要になります。その場合、質問multimap in .NETを確認する必要があります。

于 2013-05-09T08:58:26.713 に答える
0

リストは検索に O(n) かかりますが、辞書は O(1) をメモリサイズに負担がかかる必要があります。したがって、辞書のアプローチが最も速くなります

于 2013-05-09T08:58:56.483 に答える
0

いくつかのことがうまくいく可能性があります:

  • リストを使用してスキャンするだけのパフォーマンスを受け入れることができれば、完了です。
  • 2 つ以上の辞書を使用できますIDictionary<string,List<IEntity>>。Key1 をキーとする Dictionary1、Key2 をキーとする Dictionary2 など。そのキーを持つすべてのエンティティをリストに格納します。ディクショナリを介してインデックスを作成していない属性に基づくルックアップのパフォーマンスの低下を受け入れます。
  • おそらく、トライデータ構造を使用してください。
于 2013-05-09T08:59:20.127 に答える