如果您希望使用默认 LINQ 运算符从有序源中获得前 N 个,那么唯一的选择是将所有项目加载到内存中,对它们进行排序并选择前 N 个结果:
items.Sort(condition).Take(N) // Out of memory
如果您只想对前 N 个项目进行排序,那么只需先获取项目,然后对它们进行排序:
items.Take(N).Sort(condition)
更新您可以使用缓冲区来保存 N 最大订购项目:
public static IEnumerable<T> TakeOrdered<T, TKey>(
    this IEnumerable<T> source, int count, Func<T, TKey> keySelector)
{
    Comparer<T, TKey> comparer = new Comparer<T,TKey>(keySelector);
    List<T> buffer = new List<T>();
    using (var iterator = source.GetEnumerator())
    {
        while (iterator.MoveNext())
        {
            T current = iterator.Current;
            if (buffer.Count == count)
            {
                // check if current item is less than minimal buffered item
                if (comparer.Compare(current, buffer[0]) <= 0)
                    continue;
                buffer.Remove(buffer[0]); // remove minimual item
            }
            // find index of current item
            int index = buffer.BinarySearch(current, comparer);
            buffer.Insert(index >= 0 ? index : ~index, current);
        }
    }
    return buffer;
}
此解决方案还对项目使用自定义比较器(通过键比较它们):
public class Comparer<T, TKey> : IComparer<T>
{
    private readonly Func<T, TKey> _keySelector;
    private readonly Comparer<TKey> _comparer = Comparer<TKey>.Default;
    public Comparer(Func<T, TKey> keySelector)
    {
        _keySelector = keySelector;
    }
    public int Compare(T x, T y)
    {
        return _comparer.Compare(_keySelector(x), _keySelector(y));
    }
}
示例用法:
string[] items = { "b", "ab", "a", "abcd", "abc", "bcde", "b", "abc", "d" };
var top5byLength = items.TakeOrdered(5, s => s.Length);
var top3byValue = items.TakeOrdered(3, s => s);