1

質問があります。最近、自分の の 1 つを に変更IDictionaryしましたIEnumerable<KeyValuePair>。これは、このアイテムのコレクションを変更してはならないために作成されました。私が見ることができるように、これらは同じですが、IEnumerable は追加、削除などを実装していません。これにより、私とこのコレクションを使用する私の分野にとって完璧になりました。

public IDictionary<string, UserInformation> MyItems;
public IEnumerable<KeyValuePair<string, UserInformation>> MyItems;

今私の質問に。

  • コレクションを変更したくない場合、これが最も賢い方法ですか?
  • これを行うためのよりスマートな方法はありますか?
  • こんなことをしている私は愚かでしょうか?

以前にこれに似た投稿を見つけましたが、実際に何を使用し、その理由を説明しているものはありませんでした。

4

3 に答える 3

5

最も重要な問題は、IDictionaryが効率的なルックアップに使用されるように設計されていることです。本当にペアのシーケンスのみを表現したい場合は、アプローチは問題ありませんKeyValuePairが、関係が意味的にキー/値でない限り使用しません...その場合、私は本当に辞書を使用します.

もちろん、ディクショナリを公開する必要はありません。キーの値を取得するだけのメソッドを公開できます (おそらく、キーのシーケンスと値のシーケンスも公開できます)。

もちろん、読み取り専用の実装を作成することもできます。この回答にIDictionary<,>はサンプル実装があります。

于 2012-08-20T12:17:33.800 に答える
1

単一のメソッドで、クラスにラップできると思います。このようなもの:IDictionary<string, UserInformation>Get(...)

public class DictionaryWrapper
{
   private IDictionary<string, UserInformation> _dict = .... // dictionary is PRIVATE!

   public UserInformation GetUserInfo(string key)    // method is PUBLIC
   {
      UserInformation ui;
      _dict.TryGetValue(key, out ui);
      return ui;
   }
}

このようにして、次のことができます。

  • へのアクセスを制限Dictionaryし、パブリック メンバーにもアクセスを制限します。
  • ディクショナリによって提供されるO(1) アクセス速度の恩恵を受け続けますが、IEnumerable<..>代わりに使用すると失われます。
于 2012-08-20T12:17:37.930 に答える
1

ご質問により、

  1. IEnumerable は、これが変更できないコレクションであることを示すスマートな方法です。
  2. 戻り値の型をそれに変更することには多くの欠点があります。
    1. IEnumnerable<KeyValuePair<string, UserInformation>>重複キーを持つことができます。 IDictionaryできない
    2. ディクショナリとして実装されている場合、コレクション表現はすべてのインデックス/バケットなどを持っていることを意味しますが、呼び出し元はそれを知りません。索引付けが必要な場合は、独自の辞書を作成できます。
于 2012-08-20T12:25:14.673 に答える