2016-09-22 2 views
2

Чтения принятого ответа C# Java HashMap equivalent, это литературные государства:В чем разница между Dictionary.Item и Dictionary.Add?

C#'s Dictionary uses the Item property for setting/getting items:

  • myDictionary.Item[key] = value
  • MyObject value = myDictionary.Item[key]

И при попытке осуществить это, я получаю сообщение об ошибке при использовании:

myDictionary.Item[SomeKey] = SomeValue;

Error: CS1061 'Dictionary' does not contain a definition for 'Item'

И мне нужно для использования myDictionary.Add(SomeKey, SomeValue); вместо this answer и MSDN - Dictionary для устранения ошибки.

Код в порядке, но из любопытства я делаю что-то неправильно? Кроме один не компилируется, в чем разница между

Dictionary.Item[SomeKey] = SomeValue; 

и

Dictionary.Add(SomeKey, SomeValue); 

Edit:

Я редактировал принятый ответ в C# Java HashMap equivalent. Смотрите историю изданий, чтобы узнать почему.

+4

Чем позже кину DuplicateKeyException если словарь уже содержит SomeKey, в то время как бывший не будет. Подумайте об этом, как AddOrUpdate. –

+0

Это первое: Dictionary.Item [SomeKey] = SomeValue; заключается в изменении значений, уже находящихся в словаре. Другой - добавить новые слова в словарь. – jdweng

+3

Что касается вашей ошибки, просто опустите элемент, например: myDictionary [SomeKey] = SomeValue; – Evk

ответ

1

Разница проста

Dictionary[SomeKey] = SomeValue; // if key exists already - update, otherwise add 
Dictionary.Add(SomeKey, SomeValue); // if key exists already - throw exception, otherwise add 

Что касается ошибки

Error: CS1061 'Dictionary' does not contain a definition for 'Item' 

C# позволяет индексатор "по умолчанию", но, как это должно быть реализовано внутри? Помните, что существует много языков, работающих с CLR, а не только с C#, и им также нужен способ вызова этого индексатора.

CLR имеет свойства, а также предоставляет аргументы, когда вызываются свойства или сеттеры свойств, поскольку свойства действительно скомпилированы как пара методов get_PropertyName() и set_PropertyName(). Таким образом, индексатор может быть представлен свойством, которое getter и setter принимают дополнительные аргументы.

Теперь не может быть собственности без имени, поэтому нам нужно выбрать имя для свойства, которое представляет наш индекс. По умолчанию свойство «Item» используется для свойства indexer, но вы можете перезаписать его IndexerNameAttribute.

Теперь, когда индексатор представлен как стандартное именованное свойство, любой язык CLR может вызывать его с помощью get_Item (index).

Именно поэтому в статье вы указали, что указатель ссылается на Item. Хотя, когда вы используете его из C#, вы должны использовать соответствующий синтаксис и просто называют его

Dictionary[SomeKey] = SomeValue; 
+0

Я только что нашел это: [Различные способы добавления в словарь] (http://stackoverflow.com/questions/1838476/different-ways-of-adding-to-dictionary), который, на мой взгляд, стоит упоминая в качестве дополнительного для того, чтобы узнать, какова фактическая разница между ними, несмотря на ошибку. Еще раз спасибо :) –

2

Я думаю, что разница:

  • Dictionary[SomeKey] = SomeValue; (не Dictionary.Item[SomeKey] = SomeValue;) добавит новую пару ключ значение, если ключ не существует, если существует ключ, он заменит значение
  • Dictionary.Add(SomeKey, SomeValue); добавит новая пара ключей значение, и если ключ уже существует, он будет бросать исключение Аргумент: элемент с тем же ключом уже был добавлен

примером является:

try 
{ 
    IDictionary<int, string> dict = new Dictionary<int, string>(); 

    dict.Add(0, "a"); 
    dict[0] = "b"; // update value to b for the first key 
    dict[1] = "c"; // add new key value pair 
    dict.Add(0, "d"); // throw Argument Exception 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 
Смежные вопросы