Я понимаю, что это старый вопрос, но хотел добавить кое-что, о чем я думал.
Если вы знаете, что будет только один ключ к одному значению, и вам придется искать как значение, так и ключ; Вы можете создать два отдельных словаря. Один с исходным ключом в качестве ключа и значением в качестве значения, а второй с ключом в качестве значения и значением в качестве ключа.
Теперь примечание об этом; он использует больше машинных ресурсов, но я предполагаю, что это быстрее, чем грубое форсирование через LINQ и foreach.