Ну, на самом деле TryGetValue работает быстрее. Насколько быстрее? Это зависит от набора данных под рукой. Когда вы вызываете метод Contains, Dictionary выполняет внутренний поиск, чтобы найти свой индекс. Если он возвращает true, вам нужен другой поиск по индексу, чтобы получить фактическое значение. Когда вы используете TryGetValue, он выполняет поиск индекса только один раз и, если он найден, присваивает значение вашей переменной.
Edit:
Хорошо, я понимаю ваше замешательство, поэтому позвольте мне уточнить:
Дело 1:
if (myDict.Contains(someKey))
someVal = myDict[someKey];
В этом случае есть два вызова FindEntry, один для проверки наличия ключа и один для его извлечения
Дело 2:
myDict.TryGetValue(somekey, out someVal)
В этом случае есть только один вызов FindKey, потому что результирующий индекс сохраняется для фактического поиска в том же методе.