zoukankan      html  css  js  c++  java
  • .NET[C#]使用LINQ从List<T>集合中获取最后N条数据记录的方法有哪些?

    https://codedefault.com/2018/using-linq-to-get-the-last-n-elements-of-a-collection-in-csharp-application

    方案一

    collection.Skip(Math.Max(0, collection.Count() - N));
    

    我们也可以把它写成一个静态扩展方法,如:

    public static class MiscExtensions
    {
        public static IEnumerable<T> TakeLast<T>(this IEnumerable<T> source, int N)
        {
            return source.Skip(Math.Max(0, source.Count() - N));
        }
    }
    

    调用方法:

    collection.TakeLast(5);
    

    方案二

    coll.Reverse().Take(N).Reverse().ToList();
    

    静态扩展类如:

    public static IEnumerable<T> TakeLast<T>(this IEnumerable<T> coll, int N)
    {
        return coll.Reverse().Take(N).Reverse();
    }
    

    调用方法:

    coll.TakeLast(5);
    

    如果不想使用静态扩展方法,还可以使用 Enumerable.Reverse() 方法,如下:

    List<string> mystring = new List<string>() { "one", "two", "three" }; 
    mystring = Enumerable.Reverse(mystring).Take(2).Reverse().ToList();
    

    方案三

    public static class Extensions
    {
        public static IEnumerable<T> TakeLast<T>(this IEnumerable<T> collection,
            int n)
        {
            if (collection == null)
                throw new ArgumentNullException("collection");
            if (n < 0)
                throw new ArgumentOutOfRangeException("n", "n must be 0 or greater");
    
            LinkedList<T> temp = new LinkedList<T>();
    
            foreach (var value in collection)
            {
                temp.AddLast(value);
                if (temp.Count > n)
                    temp.RemoveFirst();
            }
    
            return temp;
        }
    }
    

    调用方法:

    IEnumerable<int> sequence = Enumerable.Range(1, 10000);
    IEnumerable<int> last10 = sequence.TakeLast(10);
    

    方案四

    public static class TakeLastExtension
    {
        public static IEnumerable<T> TakeLast<T>(this IEnumerable<T> source, int takeCount)
        {
            if (source == null) { throw new ArgumentNullException("source"); }
            if (takeCount < 0) { throw new ArgumentOutOfRangeException("takeCount", "must not be negative"); }
            if (takeCount == 0) { yield break; }
    
            T[] result = new T[takeCount];
            int i = 0;
    
            int sourceCount = 0;
            foreach (T element in source)
            {
                result[i] = element;
                i = (i + 1) % takeCount;
                sourceCount++;
            }
    
            if (sourceCount < takeCount)
            {
                takeCount = sourceCount;
                i = 0;
            }
    
            for (int j = 0; j < takeCount; ++j)
            {
                yield return result[(i + j) % takeCount];
            }
        }
    }
    

    调用方法:

    List<int> l = new List<int> {4, 6, 3, 6, 2, 5, 7};
    List<int> lastElements = l.TakeLast(3).ToList();
    

    方案五

    public static IEnumerable<T> FilterLastN<T>(this IEnumerable<T> source, int n, Predicate<T> pred)
    {
        int goldenIndex = source.Count() - n;
        return source.SkipWhile((val, index) => index < goldenIndex && pred(val));
    }
    

    方案六

    IEnumerable<int> source = Enumerable.Range(1, 10000);
    
    IEnumerable<int> lastThree = source.AsObservable().TakeLast(3).AsEnumerable();
    
     

    阅读了该文章的人还浏览了

  • 相关阅读:
    Enterprise Library 企业库 V4.1
    跨域实现IFRAME自适应高度
    微软企业库4.1学习笔记(二)各功能之间的依赖关系以及对象创建
    微软企业库4.1学习笔记(三)企业库迁移和并行使用,以及企业库的扩展
    微软企业库4.1学习笔记(五)对象创建和依赖注入方法
    判断 iframe 是否加载完成的完美方法
    对JavaScript调用堆栈和setTimeout用法的深入研究
    工作流技术杂谈
    企业流程管理平台V2.0介绍(.NET平台下的工作流)
    c#操作oracle lob字段[转自 芽芽的回收站]
  • 原文地址:https://www.cnblogs.com/kelelipeng/p/10096150.html
Copyright © 2011-2022 走看看