web-dev-qa-db-ja.com

c#のlist <>とdictionary <>の違いは何ですか

私はC#のリストと辞書に関して奇妙な疑問があります

リストでは、次のメソッドを使用してリストにアイテムを追加します

using System.Collections.Generic;

class Program
{
    static void Main()
    {
       List<int> list = new List<int>();
       list.Add(2);
       list.Add(3);
       list.Add(5);
       list.Add(7);
    }
}

辞書に次のようなアイテムを追加します...

using System;
using System.Collections.Generic;

class Program
{
   static void Main()
   {
      Dictionary<string, int> d = new Dictionary<string, int>();
      d.Add("cat", 2);
      d.Add("dog", 1);
      d.Add("llama", 0);
      d.Add("iguana", -1);
   }
}

違いは正確にはわかりませんが、辞書では(key、value)のペアのような項目を追加し、リストではキーを指定せずに項目を追加します。

誰かがこれを明らかにしますか?

16
rockyashkumar

IDictionaryはキー->値のマップ用、ICollectionは類似オブジェクトのセット用です。

ICollectionは、類似したオブジェクトのコレクションのインターフェースです。フォームのコントロール、リストの要素、XMLタグの属性などです。 .NET 2.0以降、汎用バージョンがあり、整数のコレクションをICollection<int>として参照できます。

IDictionaryは、あるタイプのオブジェクトまたは値を別のタイプにマッピングするためのインターフェースです。実際の辞書や電話帳のように機能します。人の名前のような「キー」が頭に浮かび、それを調べると、住所や電話番号など、そのキーによって識別されるいくつかの情報が得られます。各キーは1回しかリストできませんが、2つの異なるキーが同じ値を持つことは許可されています。これは.NET 2.0でも一般的であるため、キーが文字列で値が整数のディクショナリはIDictionary<string,int>になります。

辞書は、実際にはキーと値のペアのコレクションです。IDictionary<int,string>ICollection<KeyValuePair<int,string>>として使用でき、KeysプロパティとValuesプロパティを使用して、キーと値に個別のコレクションとしてアクセスできます。

ICollectionIDictionaryはどちらも順序付けされていません。つまり、CopyToメソッドまたはforeachループを使用して要素を特定の順序で取得できますが、その順序には特別な意味はありません。明らかな理由もなく変更される可能性があります。これがICollectionIListの主な違いです。リストを使用すると、配列のようにアイテムを特定の位置に配置でき、移動するまでアイテムを保持します。

33
SShebly

_List<>_および_Dictionary<,>_-さまざまな目的で使用されるかなり異なるデータ構造。Listは単なるアイテムのセットで、Dictionaryはキーと値のペアのセットです。

辞書は、一連の複雑なオブジェクトがあり、たとえばObjectName/ObjectIdで高速にアクセスしたい場合に非常に役立ちます。この場合、_IDictionary<string, TObject>_を作成します。ここで、キーはObjectIdで、値はオブジェクト自体です。

いくつかの違い:

  • リストはアイテムの順序を保持しますが、辞書はしません
  • リストはインデックスによる高速アクセスを許可します
  • クイックデータソートのためのQuickSortアルゴリズムが組み込まれたリストサポート
  • 辞書により、〜O(1)時間の複雑さにより、キーによって項目(値)にアクセスできます
11
sll
  • Dictionary<K,V>は、連想配列またはマップです。これは、任意のタイプの値でインデックスを付けることができるコンテナです。
  • List<T>は整数のインデックス付き配列です。これは、連続した整数によってインデックスが付けられたコンテナーです。

したがって、本質的な違いは、コンテナーのインデックス付け方法です。

Dictionary<int,T>は、意味的にはList<T>と同等であると信じ込まないでください。違いは、List<T>のインデックス付けが連続的であるのに対して、Dictionary<int,T>のインデックス付けにはギャップが存在する可能性があることです。

7
David Heffernan

リストの要素には次の特性があります。

明示的に並べ替えられない限り(たとえば、リストを並べ替えることによって)、順序を維持します。それらは任意のタイプにすることができ、タイプを混合することができます。数値(ゼロベース)インデックスを介してアクセスされます。辞書の要素には、次の特性があります。

すべてのエントリにはキーがあり、値の順序は保証されていません。要素はキー値を使用してアクセスされますタイプを混在させることができます

0
Mighty

さまざまなT-sql sprocにアクセスするクラスライブラリがあります。各sprocは単一の行を返しますが、列は異なります。値を取得するための汎用ソリューションが必要でした。Dictionary<>はList <>よりもはるかにクリーンなソリューションを提供しました。

すべてのラッパーに共通するクラスが宣言します

public Dictionary<string, String> datadict = new Dictionary<string, string>();

そして

public Dictionary<string, String> LoadData(string sproc, string paramName, string paramValue)

リーダーを呼び出すと、datadictが読み込まれます

for (int i = Reader.FieldCount; i != 0; i--)
 {
  datadict.Add(Reader.GetName(i - 1).Trim(), Reader.GetString(i - 1).Trim());
 }

そしてdatadictを呼び出し側クラスに返し、Readerと同じようにデータを取得できます。例えば。:

datadict = myData.LoadData("spGetSSN", "", "");
  ssn1 = datadict["SSN1"];
  ssn2 = datadict["SSN2"];
  ssn3 = datadict["SSN3"];

リスト<>のほうがずっときれいです。

0
john rains