#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, чтобы перейти к первому элементу.