小编DRB*_*ise的帖子

LINQ中的OrderBy和Top具有良好的性能

从大型集合中获取前10条记录并使用自定义OrderBy的好方法是什么?如果我使用LINQ to Objects OrderBy方法,它会很慢并占用大量内存,因为它会使用新订单创建一个完整的新集合.我想要一个带有下面签名的新方法,它不会重新整理整个集合并且非常快:

public static IEnumerable<TSource> OrderByTop<TSource, TKey>(
    IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector,
    IComparer<TKey> comparer,
    int topCount)
Run Code Online (Sandbox Code Playgroud)

我试着写它但它变得非常复杂,我想可能有更简单的方法使用Aggregate或其他东西.任何帮助,将不胜感激.

回答

谢谢您的帮助.我最终得到了以下代码:

public static List<TSource> OrderByTop<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector,
    IComparer<TKey> comparer,
    int topCount)
{
    var itemComparer = keySelector.ToIComparer(comparer);
    return source.Aggregate(
        new List<TSource>(topCount),
        (List<TSource> list, TSource item) =>
            list.SortedInsert(item, itemComparer, topCount));
}
Run Code Online (Sandbox Code Playgroud)

List Extension方法SortedInsert如下:

public static List<T> SortedInsert<T>(
    this List<T> list,
    T item,
    IComparer<T> comparer,
    int maxLength)
{
    if (list.Count == maxLength)
        if (comparer.Compare(item, list[maxLength - 1]) >= …
Run Code Online (Sandbox Code Playgroud)

c# linq performance linq-to-objects sql-order-by

12
推荐指数
1
解决办法
5489
查看次数

标签 统计

c# ×1

linq ×1

linq-to-objects ×1

performance ×1

sql-order-by ×1