Если вам нужно знать только три верхних значения, вам не нужно сортировать весь список - вы можете просто выполнить один проход, сохраняя три верхних значения одновременно. Это сделает его O (n), а не O (n log n) ... но вам придется реализовать его самостоятельно.
Если вы довольны O (n log n), возможно, самый простой способ - использовать LINQ:
var ordered = pairs.OrderBy(pair => pair.Value).Take(3).ToList();
Вероятно, было бы не так сложно реализовать что-то вроде:
public static IEnumerable<TSource> TakeTop<TSource, TKey>
(this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector,
int count)
, который может иметь сложность O (n * count). Если бы у меня было немного больше времени, я бы сделал это ради удовольствия ...