Словарь с одним элементом

#c# #dictionary

#c# #словарь

Вопрос:

В случае, когда Dictionary<object, object> myDictionary оказывается, что он содержит один элемент, каков наилучший способ извлечения объекта value (если меня не волнует ключ)?

 if (myDictionary.Count == 1)
{
    // Doesn't work
    object obj = myDictionary.Values[0];
}
  

Спасибо

Комментарии:

1. Мне любопытно, зачем вам это понадобилось…

Ответ №1:

В зависимости от того, хотите ли вы, чтобы это завершилось неудачей, если есть несколько объектов или нет, вы можете использовать либо

 myDictionary.Values.Single(); // Will fail if there's more than one
  

или

 myDictionary.Values.First(); // Will just return the first regardless of the count
  

Комментарии:

1. .FirstOrDefault() является самым безопасным, поскольку он возвращает null, если их нет, и null можно безопасно проверить.

2. @Cylon: Однако это не может определить, равно ли оно нулю, потому что значение элемента равно null или потому, что элемента не было.

3. @Gaffa, вы можете провести это различие, если это важно, проверив количество ключей в словаре. С другой стороны, я бы счел, что создание ключа с соответствующим нулевым значением является ошибкой.

4. @cylon если отсутствие объектов является исключительной ситуацией, ее следует рассматривать как таковую, а не маскировать как нулевую ссылку. возвращать null, если вы не тестируете его, небезопасно, и если вы собираетесь тестировать на null, вы могли бы также позволить коду показать, что отсутствие объектов является исключительной ситуацией, а затем обработать потенциальное исключение

5. @Rune, «null» имеет очень специфическое значение: может существовать значение, которое могло бы перейти сюда, но мы не знаем, что это такое. Это полностью отличается от «исключительного условия», которое должно просто выдаваться как исключение.

Ответ №2:

 object obj = myDictionary.Values.Single();
  

Ответ №3:

Я бы никогда не стал кодировать, исходя из предположения, что будет только один. Если вы знаете, что всегда будет ровно один, то зачем использовать словарь?

Комментарии:

1. Я пришел в поисках того, что делать в этой ситуации с этой мыслью. К сожалению, моя ситуация заключается в возврате ключа и значения в веб-API. Например, в JSON словари связывают ключ и значение вместе, в то время как KeyValuePair связывает ключ с «Ключом», а значение со «Значением», а не друг с другом, что я нахожу далеко не идеальным. Есть ли шанс, что вы могли бы расширить мысли, на которые вы намекаете в этом ответе?

2. Добавление JSON в микс действительно меняет ситуацию; вам нужно смоделировать на стороне сервера то, что ожидает клиентская сторона. Итак, в этом случае словарь работает.

Ответ №4:

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

 object obj = yourDictionary[theKeyThatYouHappenToKnow];
  

или используйте перечислитель:

 var en = yourDictionary.GetEnumerator();
en.MoveNext();
object obj = en.Current.Value;
en.Dispose();
  

Если вы используете framework 3.5, вы также можете использовать какой-либо метод расширения, такой как Single или First , чтобы использовать перечислитель для вас.

Ответ №5:

Я думаю, вы можете использовать итератор.


myDictionary.GetEnumerator().Current

Комментарии:

1. Перечислитель запускается перед первым элементом, вам нужно вызвать MoveNext, чтобы перейти к первому элементу.