Кажется, что в TValue отсутствует один, на мой взгляд, обязательный метод; TValue.Equals(TValue).
Так какой же быстрый и достойный способ сравнить 2 TValues, желательно без использования TValue.ToString(), который допускает ложные совпадения между вариантами, записями и т.д.