違いは何ですかDictionary.add(key, value)
とはDictionary[key] = value
?
ArgumentException
重複キーを挿入するときに最後のバージョンではがスローされないことに気付きましたが、最初のバージョンを優先する理由はありますか?
編集:これに関する信頼できる情報源はありますか?私はMSDNを試しましたが、それはいつものように野生のガチョウの追跡です:(
違いは何ですかDictionary.add(key, value)
とはDictionary[key] = value
?
ArgumentException
重複キーを挿入するときに最後のバージョンではがスローされないことに気付きましたが、最初のバージョンを優先する理由はありますか?
編集:これに関する信頼できる情報源はありますか?私はMSDNを試しましたが、それはいつものように野生のガチョウの追跡です:(
回答:
パフォーマンスはほぼ100%同一です。これは、Reflector.netでクラスを開いて確認できます。
これはこのインデクサーです:
public TValue this[TKey key]
{
get
{
int index = this.FindEntry(key);
if (index >= 0)
{
return this.entries[index].value;
}
ThrowHelper.ThrowKeyNotFoundException();
return default(TValue);
}
set
{
this.Insert(key, value, false);
}
}
そして、これはAddメソッドです:
public void Add(TKey key, TValue value)
{
this.Insert(key, value, true);
}
Insertメソッド全体はかなり長いので投稿しませんが、メソッド宣言は次のとおりです。
private void Insert(TKey key, TValue value, bool add)
そして関数のさらに下で、これは起こります:
if ((this.entries[i].hashCode == num) && this.comparer.Equals(this.entries[i].key, key))
{
if (add)
{
ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);
}
これは、キーがすでに存在するかどうかをチェックし、存在し、パラメータaddがtrueの場合、例外をスローします。
したがって、すべての目的と意図でパフォーマンスは同じです。
他のいくつかの言及と同様に、同じキーを2回追加しようとする試みについて、チェックが必要かどうかがすべてです。
投稿が長かったため申し訳ありませんが、それでいいと思います。
最初のバージョンは、新しいKeyValuePairをディクショナリに追加し、キーがすでにディクショナリにある場合にスローします。2番目は、インデクサーを使用して、キーが存在しない場合は新しいペアを追加しますが、キーが辞書に既に存在する場合はキーの値を上書きします。
IDictionary<string, string> strings = new Dictionary<string, string>();
strings["foo"] = "bar"; //strings["foo"] == "bar"
strings["foo"] = string.Empty; //strings["foo"] == string.empty
strings.Add("foo", "bar"); //throws
Dictionary.Add(key, value)
そしてDictionary[key] = value
異なる目的があります:
Add
メソッドを使用して新しいキー/値ペアを追加します。既存のキーは置き換えられません(ArgumentException
スローされます)。最初にこの質問に答えるには、辞書の目的と基礎となるテクノロジーを確認する必要があります。
Dictionary
KeyValuePair<Tkey, Tvalue>
各値が一意のキーによって表される場所のリストです。あなたの好きな食べ物のリストがあるとしましょう。各値(食品名)は、固有のキー(位置=この食品がどれだけ好きか)で表されます。
コード例:
Dictionary<int, string> myDietFavorites = new Dictionary<int, string>()
{
{ 1, "Burger"},
{ 2, "Fries"},
{ 3, "Donuts"}
};
たとえば、健康を維持したい、考えが変わった、お気に入りの「バーガー」をサラダに置き換えたいとしましょう。リストは引き続きお気に入りのリストであり、リストの性質を変更することはありません。あなたのお気に入りはリストのナンバーワンのままで、その価値だけが変わります。これはあなたがこれを呼ぶときです:
/*your key stays 1, you only replace the value assigned to this key
you alter existing record in your dictionary*/
myDietFavorites[1] = "Salad";
しかし、あなたがプログラマーであることを忘れないでください、そしてあなたは今からあなたの文章を;で終えます。絵文字はコンパイルエラーをスローし、お気に入りのすべてのリストは0インデックスベースであるため、絵文字の使用を拒否します。
あなたの食事も変わりました!したがって、リストをもう一度変更します。
/*you don't want to replace Salad, you want to add this new fancy 0
position to your list. It wasn't there before so you can either define it*/
myDietFavorites[0] = "Pizza";
/*or Add it*/
myDietFavorites.Add(0, "Pizza");
定義には2つの可能性があります。以前に存在しなかったものに新しい定義を与えるか、またはすでに存在する定義を変更したいかのいずれかです。
Addメソッドを使用すると、レコードを追加できますが、この定義のキーは辞書に存在しない可能性があります。
次に、内部を調べます。辞書を作成するとき、コンパイラはバケット(レコードを格納するためのメモリ内のスペース)を予約します。バケットは、定義した方法でキーを保存しません。各キーはバケット(Microsoftが定義)に移動する前にハッシュされます。値の部分は変更されないことに注意してください。
私の例を簡略化するために、CRC32ハッシュアルゴリズムを使用します。定義するとき:
myDietFavorites[0] = "Pizza";
バケットに送られるのはdb2dc565 "Pizza"(簡略化)です。
で値を変更すると:
myDietFavorites[0] = "Spaghetti";
再びdb2dc565である 0をハッシュしてから、バケットでこの値を検索して、そこにあるかどうかを確認します。そこにある場合は、キーに割り当てられた値を書き換えるだけです。そこにない場合は、値をバケットに入れます。
次のように辞書でAdd関数を呼び出すと、
myDietFavorite.Add(0, "Chocolate");
0をハッシュして、その値をバケット内の値と比較します。そこにない場合にのみ、バケットに入れることができます。
文字列または文字タイプのキーの辞書を操作する場合は特に、それがどのように機能するかを知ることが重要です。ハッシュが行われるため、大文字と小文字が区別されます。したがって、たとえば "name"!= "Name"です。これを表すためにCRC32を使用してみましょう。
「名前」の 値は:e04112b1「名前」の値は:1107fb5b
パフォーマンスの類似性が最も高いと考えられる場合は、使用しているコードに対してより正確で読みやすいと思われるものを使用してください。
追加を説明する操作を感じます。キーが存在することはすでに非常にまれな例外であるため、追加で最もよく表されます。意味的にはもっと理にかなっています。
dict[key] = value
より良い置換を表します。そのコードを見ると、とにかく、キーが既に辞書にあることを期待しています。
dic[key] = value
キーが既に存在しているとは思いませんが、議論の余地があると思います;)
辞書に値を挿入するには
Dictionary<string, string> dDS1 = new Dictionary<string, string>();//Declaration
dDS1.Add("VEqpt", "aaaa");//adding key and value into the dictionary
string Count = dDS1["VEqpt"];//assigning the value of dictionary key to Count variable
dDS1["VEqpt"] = Count + "bbbb";//assigning the value to key