0

ソートされたオブジェクトのコレクションへのインターフェイスを作成しています。いつものように、これらの項目をどのようにソートするかはユーザーに任せます。ただし、現在、キーと値のインターフェイス (ソートキーが値から明示的に分離されている) を提供するか、値のみのインターフェイス (値がソートキーでもあるか、ユーザーが別のソートを処理する必要がある) を提供するかで悩んでいます。いくつかの比較関数を渡すことによってキー)。

私の見解では、キーと値のインターフェイスは、ユーザーが常に値とは別のキーを持つことを強制します。それは、ある値が自然に独自のキーを形成する場合でも同様です。ただし、ユーザーからキーを処理する責任がなくなるため、API を使用するときにユーザー コードがよりシンプルでクリーンになる可能性があります。値のみのインターフェイスでは、独自のキーである値をよりコンパクトに表現できますが、キーと値が自然に区別される場合、ユーザーは独自のキーを追跡して処理する必要があります。

もちろん、両方のアプローチをサポートする文献がありますが、古い文献は値のみのアプローチを好む傾向があり、新しい文献はキーと値のアプローチを好む傾向があるように私には思えますが (これについては間違っている可能性があります)。

このような場合のあなたの好みが気になります。どちらか一方が一般的に優先される時点に到達しましたか? そうでない場合、通常は何を使用していますか。また、その理由は何ですか?

4

3 に答える 3

1

あなたは呼ばれるものの間で引き裂かれているようです(さまざまな言語で、さまざまな区別がありますが、本質的に...)

  • ディクショナリ (別名ハッシュテーブルでもハッシュでも)
  • リスト/配列

これら 2 種類のコンテナーは異なる目的を果たしますが、いくつかの調整を加えれば、ディクショナリにできてリストにできることはほとんどありません。これは、Dictionary の方がより多くの情報を持っているためです。

一般に、暗黙的よりも明示的である方が適切です。
(リスト) を渡せば"2 dollars blue crayon"、次のプロパティを持つオブジェクトであると推測できます: {Price = 2$, Color = blue, Type = Crayon} (辞書)。ただし、そのような解析 (必要な場合) には、ドメインまたはデータの暗黙の構造に関する労力と知識の両方が必要です。ディクショナリ アプローチを使用すると、一般的な方法で情報を処理できます。

リストの方が「優れている」場合もいくつかありますが、それは多くの場合、リスト アプローチの固有の特性ではなく、技術的/運用上の考慮事項に結び付けられています。たとえば、単純な全文検索エンジンを使用して検索インデックスを実装するには、すべてのプロパティを一緒にマッシュする必要がある場合があります (これは、エンド ユーザーがラベルのないキーワードを入力し、それらが任意のプロパティで見つかることを期待する方法を反映しています)。

質問に対する実際的な推奨事項は、以下を提供することです

  • リストとディクショナリの両方の使用法/動作を公開する API
  • 少なくともコンテナがディクショナリとして使用されるまで、パフォーマンスに関してリストのアプローチの「エッジ」の一部を保持する、最適化された (重要な場所に応じて、サイズおよび/またはスペースに関する) 実装。

パフォーマンスに関するアプリオリな明らかな懸念 (例: コンテナーが何万ものアイテムを受け取る、何千ものコンテナー インスタンスが存在する、コンテナーが低速チャネルを通過するなど) でない限り、私はまずAPI に集中し、気楽に取り組みます。たとえば、ディクショナリに基づいて実装します。後日、必要に応じて、たとえば 2 つのリストとマップ スキーマを使用して、実装を修正できます。

最後にもう 1 つ:この種のポリモーフィック コンテナーを提供するライブラリ (または言語組み込み) はたくさんあります。ターゲット システム/言語で使用できるライブラリがあるかどうかを確認してください...

于 2009-10-15T20:22:26.970 に答える
0

さて、これはあなたの要件に答えているようです。keyselctor が指定されていない場合、コレクションはアイテム自体で順序が定義されていると想定します。おそらく IComparable を実装する必要があります。それ以外の場合-理論的に多くの方法で比較できるアイテムがある場合-それ自体で IComparable であるアイテムの射影を返すキーセレクターを指定できます。

たとえば、名前と年齢を持つクラス Person があり、年齢別に並べ替えられたリストを保持する場合は、次の方法でコレクションを作成します。

new OrderedCollection(person => person.Age);

ところで、.Net に付属する SortedDictionary および SortedList コレクションを確認してください。それらは重宝するかもしれません。

于 2009-10-15T20:22:03.443 に答える
0

キー+値のラッパー構造体またはオブジェクトを作成し、値の部分を空白のままにしておくと、リストでできることはほぼ何でも辞書でできます。ディクショナリが実際にできない唯一のことは、特定の型の値を追加し、その型を返す列挙子を使用して GetEnumerator 要求に直接応答することです。ただし、それを行うために辞書の周りにラッパー クラスを構築するのは簡単です。

ただし、ディクショナリとリストの主な違いは、キー部分が同一で値部分が異なるレコードの処理方法です。私はディクショナリが物事を処理する方法の大ファンではありませんが (デフォルトのインデックス付きプロパティは「置換」セマンティクスを使用しますが、add メソッドは存在しない場合に失敗するセマンティクスを使用します。私の好みは、「追加」のモード パラメータを持つことでした)。 ")、特定のキーに関連付けられた値を変更できます。「リスト」は、古い値を削除して新しい値を追加することによってのみ、これを実行しようとすることができます。この操作は、意味上の問題を引き起こす可能性があります。

于 2010-10-25T19:58:51.303 に答える