Получение Значения Словаря Рекомендации


Я только недавно заметил Dictionary.TryGetValue(TKey key, out TValue value) и было любопытно, какой из них является лучшим подходом к извлечению значения из словаря.

Я традиционно сделал:

if (myDict.Contains(someKey))
     someVal = myDict[someKey];
     ...

Если я не знаю его и здесь.

лучше просто сделать:

if (myDict.TryGetValue(somekey, out someVal)
    ...

какая практика лучше? Один быстрее другого? Я бы предположил, что версия Try будет медленнее, так как ее "проглатывание" try / catch внутри себя и использование это как логика, нет?

спасибо!

3 78

3 ответа:

TryGetValue немного быстрее, потому что FindEntry будет вызываться только один раз.

насколько быстрее? Это зависит от набор данных под рукой. Когда вы называете Содержит метод, словарь делает внутренний поиск, чтобы найти его индекс. Если она возвращает true, вам нужен другой индекс поиска, чтобы получить фактическое значение. Когда вы используете TryGetValue, он выполняет поиск только один раз для индекса и если нашли, он присваивает значение переменной.

FYI: это не ловить ошибки.

Он зовет:

public bool TryGetValue(TKey key, out TValue value)
{
    int index = this.FindEntry(key);
    if (index >= 0)
    {
        value = this.entries[index].value;
        return true;
    }
    value = default(TValue);
    return false;
}

ContainsKey это:

public bool ContainsKey(TKey key)
{
    return (this.FindEntry(key) >= 0);
}

ну на самом деле TryGetValue быстрее. Насколько быстрее? Это зависит от набора данных под рукой. При вызове метода Contains словарь выполняет внутренний поиск, чтобы найти его индекс. Если он возвращает true, вам нужен другой поиск индекса, чтобы получить фактическое значение. Когда вы используете TryGetValue, он выполняет поиск индекса только один раз, и если он найден, он присваивает значение вашей переменной.

Edit:

хорошо, я понимаю ваше замешательство так что позвольте мне уточним:

Пример 1:

if (myDict.Contains(someKey))
     someVal = myDict[someKey];

в этом случае есть 2 вызова FindEntry, один, чтобы проверить, если ключ существует и один, чтобы получить его

Пример 2:

myDict.TryGetValue(somekey, out someVal)

в этом случае есть только один вызов FindKey, потому что результирующий индекс сохраняется для фактического извлечения в том же методе.

Я думаю, что trygetvalue делает что-то вроде:

if(myDict.ReallyOptimisedVersionofContains(someKey))
{ 
  someVal = myDict[someKey];
  return true;
}
return false;

Так что, надеюсь, не попробовать / поймать в любом месте.

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