Linq 常用方法解释

/// <summary>
/// linq
/// </summary>
public class Linq
{
    /// <summary>
    /// 测试
    /// </summary>
    public static void Test()
    {
        Aggregate1();
        Aggregate2();
        Aggregate3();
        All();
        Any();
        Any1();
        Average1();
        Cast();
        Concat();
        Contains();
        DefaultIfEmpty();
        Distinct();
        ElementAt();
        First();
        OrderBy();
        Select();
        SelectMany();
        Skip();
        Where();
    }

    /// <summary>
    /// 对序列应用累加器函数。
    /// </summary>
    public static void Aggregate1()
    {
        // 1+2+3+4+5
        var numbers = GetArray(5);
        var result = numbers.Aggregate<int>((a, b) => a + b);
        Console.WriteLine("和为:{0}", result);
        /*
         * Aggregate 接收一个 Func<TSource, TSource, TSource> func 参数
         * 要对每个元素调用的累加器函数
         * 累加器的最终值
         * 所以1-5的最终累加结果为15
         * 如果在1-5累加的时候 需要首先加个5怎么办 见 Aggregate2()
         */
    }

    /// <summary>
    ///  对序列应用累加器函数。 将指定的种子值用作累加器初始值。
    /// </summary>
    public static void Aggregate2()
    {
        // 1+2+3+4+5
        var numbers = GetArray(5);
        var result = numbers.Aggregate<int, int>(5, (a, b) => a + b);
        Console.WriteLine("和为:{0}", result);
        /*
         * Aggregate 接收2个参数 TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func
         * seed 累加器的初始值
         * func 要对每个元素调用的累加器函数
         * 累加器的最终值
         * 所以1-5的最终累加结果为20 因为累加的初始值是5
         * 如果要对最终结果 在-2 怎么处理呢 Aggregate3()
         */
    }

    /// <summary>
    ///  对序列应用累加器函数。 将指定的种子值用作累加器初始值。
    /// </summary>
    public static void Aggregate3()
    {
        // 1+2+3+4+5
        var numbers = GetArray(5);
        var result = numbers.Aggregate<int, int, int>(5, (a, b) => a + b, rel => rel - 2);
        Console.WriteLine("和为:{0}", result);
        /*
         * Aggregate 接收3个参数 TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func, Func<TAccumulate, TResult> resultSelector
         * seed 累加器的初始值
         * func 要对每个元素调用的累加器函数
         * resultSelector 结果处理
         * 累加器的最终值
         * 所以1-5的最终累加结果为18 因为累加的初始值是5 并且最终几个会 -2
         *
         */
    }

    /// <summary>
    /// 确定序列中的所有元素是否满足条件
    /// </summary>
    public static void All()
    {
        var list = Book.Books;

        // 这个集合中是否 所有的页数都大于200页 如果都大于则返回true否则返回 false
        var result = list.All(item => item.PageCount > 100);
    }

    /// <summary>
    /// 确定序列是否包含任何元素
    /// </summary>
    public static void Any()
    {
        var list = Book.Books;

        // 这个集合是否有元素 如果存在则有true 否则 返回false
        var result = list.Any();
    }

    /// <summary>
    /// 确定序列是否包含任何元素
    /// </summary>
    public static void Any1()
    {
        var list = Book.Books;

        // 这个集合中是否 包含的页数大于200页的元素 如果包含则返回true否则返回 false
        var result = list.Any(item => item.PageCount > 200);
    }

    /// <summary>
    /// 计算可以为 null 的 System.Decimal 值序列的平均值。
    /// </summary>
    public static void Average1()
    {
        var numbers = GetArray(5);

        // 平均值
        var result = numbers.Average();

        // 最大值
        var rel = numbers.Max();

        // 最小值
        var rel1 = numbers.Min();

        // 求和
        var rel2 = numbers.Sum();

        var list = Book.Books;
    }

    /// <summary>
    /// 计算序列的平均值。
    /// </summary>
    public static void Average2()
    {
        var list = Book.Books;

        // 求平均页数
        var result = list.Average(item => item.PageCount);
    }

    /// <summary>
    /// 将 System.Collections.IEnumerable 的元素强制转换为指定的类型
    /// </summary>
    public static void Cast()
    {
        // 首先创建一个以前版本的集合
        ArrayList arraylist = new ArrayList();

        // 原本希望在这里初始化,但是这个初始化功能不支持以前的版本
        arraylist.Add("111");
        arraylist.Add("222333");
        arraylist.Add("333333333");
        arraylist.Add("xxxxxxxxx");

        // 数据类型不一直的时候 Cast会抛出异常OfType 则会返回一个空序列
        // IEnumerable<int> lists = arraylist.Cast<int>();
        IEnumerable<int> lists = arraylist.OfType<int>();
        foreach (int list in lists)
        {
            Console.WriteLine(list);
        }
    }

    /*Concat/Union/Intersect/Except操作*/
    /*
     * 连接操作
     * Concat  :连连接两个序列
     * Union  : 通过使用默认的相等比较器生成两个序列的并集
     * Intersect : 通过使用默认的相等比较器对值进行比较生成两个序列的交集
     * Except : 排除相交项;延迟。即是从某集合中删除与另一个集合中相同的项。先遍历第一个集合,找出所有唯一的元素,然后再遍历第二个集合,返回第二个集合中所有未出现在前面所得元素集合中的元素
     */

    /// <summary>
    /// 连连接两个序列
    /// </summary>
    public static void Concat()
    {
        // 假设有两序列:
        var a = new List<int> { 1, 1, 2, 3, 4 };
        var b = new List<int> { 4, 5, 5, 6, 7 };
        /*
         * 那么A.Concat(B) 表示将A序列和B序列串联起来,以创建新的序列,不去除重复部分;
         * A.Union(B)表示将A序列和B序列串联起来,并去除重复部分,以创建新的序列;
         * 而A.Intersect(B) 只取A序列和B序列相同的部分(交集),以创建新的序列。
         * Except则是差集
         */
        var concat = a.Concat(b).ToList();
        var union = a.Union(b).ToList();
        var intersect = a.Intersect(b).ToList();
        var except = a.Except(b).ToList();
    }

    /// <summary>
    /// 通过使用默认的相等比较器确定序列是否包含指定的元素
    /// </summary>
    public static void Contains()
    {
        IEnumerable<int> a = new List<int> { 1, 1, 2, 3, 4 };

        // 序列是否包含 元素3
        bool rel = a.Contains(3);

        var list = Book.Books;

        // 使用自定义比较器
        bool rel1 = list.Contains(new Book { Title = "C#" }, new BookEqualityComparer());
    }

    /// <summary>
    /// 返回序列中的元素数量。
    /// </summary>
    public static void Count()
    {
        var list = Book.Books;
        var count = list.Count();
        var count1 = list.Count(item => item.Title == "C#");
    }

    /// <summary>
    /// 返回指定序列的元素;如果序列为空,则返回单一实例集合中的类型参数的默认值。
    /// </summary>
    public static void DefaultIfEmpty()
    {
        IEnumerable<Book> list = new List<Book>();
        var rek = list.DefaultIfEmpty();
        var rek1 = list.DefaultIfEmpty(new Book { Title = "VV" });
    }

    /// <summary>
    /// 去除重复
    /// </summary>
    public static void Distinct()
    {
        IEnumerable<int> a = new List<int> { 1, 1, 2, 3, 4 };
        var rel = a.Distinct();
    }

    /// <summary>
    /// 返回序列中指定索引处的元素。
    /// </summary>
    public static void ElementAt()
    {
        IEnumerable<int> a = new List<int> { 1, 1, 2, 3, 4 };

        // 返回索引为3的元素
        var rel = a.ElementAt(3);

        // 返回序列中指定索引处的元素;如果索引超出范围,则返回默认值。
        // int类型的默认值 则为0
        var rel1 = a.ElementAtOrDefault(50);
    }

    /// <summary>
    /// 返回元素第一个元素
    /// </summary>
    public static void First()
    {
        var a = Book.Books;

        // 返回第一个元素 没有元素则报错
        var r1 = a.First();

        // 返回第一个元素 没有元素则返回默认值
        var r2 = a.FirstOrDefault();

        // 返回序列的唯一元素;如果该序列并非恰好包含一个元素,则会引发异常
        // var r3 = a.Single();

        // 返回序列中的唯一元素;如果该序列为空,则返回默认值;如果该序列包含多个元素,此方法将引发异常。
        // var r4 = a.SingleOrDefault();

        // 返回最后一个元素 没有元素则报错
        var r5 = a.Last();

        // 返回最后一个元素 没有元素则返回默认值
        var r6 = a.LastOrDefault();
    }

    /// <summary>
    /// 分组
    /// </summary>
    public static void GroupBy()
    {
        var list = Book.Books;

        // 计数
        var q = from p in list
                group p by p.Title into g
                select new
                {
                    g.Key,
                    NumProducts = g.Count()
                };

        // 带条件计数
        var q1 = from p in list
                 group p by p.Title into g
                 select new
                 {
                     g.Key,
                     NumProducts = g.Count(p => p.PageCount > 200)
                 };

        // Where限制
        var q2 = from p in list
                 group p by p.Title into g
                 where g.Count() >= 10
                 select new
                 {
                     g.Key,
                     NumProducts = g.Count(p => p.PageCount > 200)
                 };

        // 多列(Multiple Columns)
        var categories = from p in list group p by new { p.Title, p.PageCount } into g select new { g.Key, g };

        // 表达式(Expression)
        var categories1 = from p in list group p by new { Criterion = p.PageCount > 10 } into g select g;
    }

    /// <summary>
    /// 排序
    /// </summary>
    public static void OrderBy()
    {
        var list = Book.Books;

        // 根据页码升序
        var rel1 = list.OrderBy(o => o.PageCount);

        // 根据页码+标题升序
        var rel11 = list.OrderBy(o => o.PageCount).ThenBy(o => o.Title);

        // 根据页码降序
        var rel2 = list.OrderByDescending(o => o.PageCount);

        // 根据页码+标题降序
        var rel22 = list.OrderByDescending(o => o.PageCount).ThenByDescending(o => o.Title);

        // 根据标题的长度升序 排序
        var rel = list.OrderBy(o => o.Title, new BookComparer()).ToList();
    }

    /// <summary>
    /// 投影
    /// </summary>
    public static void Select()
    {
        var list = Book.Books;

        // 投影一个新的集合
        var select = list.Select(item => new { T = item.Title });

        // 投影一个待索引的集合
        var select1 = list.Select((item, index) => new { I = index });
    }

    /// <summary>
    /// 将序列的每个元素投影并将结果序列合并为一个序列。
    /// </summary>
    public static void SelectMany()
    {
        /*
         * 类School下面有一个Class的集合,每个Class下面有有一个Student的集合。每个学生有Name和Sex两个属性。现在需要遍历School下面的所有的学生,当然我们可以用两个嵌套的foreach语句类遍历School下面的所有的Class,然后再用foreach来遍历Class下面的所有的Student,把他们添加到一个List里去。这个场景也是实际编程中经常遇到的。有了Linq我们就可以大大的简化我们的代码:
         */

        // 初始化数据
        School s = new School();
        for (int i = 0; i < 5; i++)
        {
            s.Classes.Add(new Class());
        }
        s.Classes[0].Students.Add(new Student(1, "a0"));
        s.Classes[1].Students.Add(new Student(1, "b0"));
        s.Classes[2].Students.Add(new Student(0, "c0"));
        s.Classes[3].Students.Add(new Student(0, "d0"));
        s.Classes[4].Students.Add(new Student(0, "e0"));
        s.Classes[0].Students.Add(new Student(0, "a1"));
        s.Classes[0].Students.Add(new Student(1, "a1"));
        s.Classes[0].Students.Add(new Student(1, "a2"));
        s.Classes[0].Students.Add(new Student(1, "a3"));
        s.Classes[1].Students.Add(new Student(0, "b1"));
        s.Classes[2].Students.Add(new Student(0, "c1"));
        s.Classes[3].Students.Add(new Student(0, "d1"));

        // 取出school下的所有性别是0的student
        var x = s.Classes.SelectMany(b => b.Students).Where(i => i.Sex == 0);
        foreach (var b in x)
        {
            Console.WriteLine(b.Name);
        }

        // 合并
        var x1 = s.Classes.SelectMany(b => b.Students, (a, c) => new { a.Students.Count, c.Name });
    }

    /// <summary>
    ///  跳过序列中指定数量的元素,然后返回剩余的元素。
    /// </summary>
    public static void Skip()
    {
        var list = Book.Books;

        // 跳高前2个元素
        var rel = list.Skip(2);

        // 只要满足指定的条件,就跳过序列中的元素,然后返回剩余元素。
        var rel1 = list.SkipWhile(iem => iem.PageCount < 2000).ToList();

        // 返回前2个元素
        var rel2 = list.Take(2);

        // 只要满足指定的条件,就会返回序列的元素。
        var rel3 = list.TakeWhile(w => w.PageCount < 2000).ToList();
    }

    /// <summary>
    /// 查询
    /// </summary>
    public static void Where()
    {
        var list = Book.Books;

        // 页码大于2000页的
        var rel = list.Where(w => w.PageCount > 2000);

        // 页码大于2000页的 并且索引大于2
        var rel1 = list.Where((a, b) => a.PageCount > 2000 && b > 2);
    }

    /// <summary>
    /// 比较器
    /// </summary>
    public class BookComparer : IComparer<string>
    {
        /// <summary>
        /// 实现
        /// </summary>
        /// <param name="x">x</param>
        /// <param name="y">y</param>
        /// <returns>一个有符号整数,指示 x 与 y 的相对值,如下表所示。 值 含义 小于零 x 小于 y。 零 x 等于 y。 大于零 x 大于 y</returns>
        public int Compare(string x, string y)
        {
            if (x.Length > y.Length)
            {
                return 1;
            }
            else if (x.Length < y.Length)
            {
                return -1;
            }

            return 0;
        }
    }

    /// <summary>
    /// 书籍比较器
    /// </summary>
    public class BookEqualityComparer : IEqualityComparer<Book>
    {
        /// <summary>
        /// 比较器
        /// </summary>
        /// <param name="x">x</param>
        /// <param name="y">y</param>
        /// <returns>结果</returns>
        public bool Equals(Book x, Book y)
        {
            return x.Title == y.Title;
        }

        /// <summary>
        /// GetHashCode
        /// </summary>
        /// <param name="obj">obj</param>
        /// <returns>HashCode</returns>
        public int GetHashCode(Book obj)
        {
            return obj.Title.GetHashCode();
        }
    }

    /// <summary>
    /// 获取一个值的集合
    /// </summary>
    /// <param name="max">最大值</param>
    /// <returns>一个值的集合</returns>
    public static IEnumerable<int> GetArray(int max)
    {
        List<int> result = new List<int>(max);
        for (int i = 0; i < max; i++)
        {
            result.Add(i + 1);
        }
        return result;
    }

    /// <summary>
    /// 书籍
    /// </summary>
    public class Book
    {
        /// <summary>
        /// 标题
        /// </summary>
        public string Title { get; set; }

        /// <summary>
        /// 页数
        /// </summary>
        public int PageCount { get; set; }

        /// <summary>
        /// 默认的书籍集合
        /// </summary>
        public static IEnumerable<Book> Books
        {
            get
            {
                return new List<Book>
                           {
                               new Book { Title = "C#", PageCount = 1200 },
                               new Book { Title = "MVC", PageCount = 2200 },
                               new Book { Title = "ASP.NET", PageCount = 12200 },
                               new Book { Title = "java", PageCount = 1500 },
                               new Book { Title = "jquery", PageCount = 2140 },
                           };
            }
        }
    }

    /// <summary>
    /// 学校
    /// </summary>
    public class School
    {
        /// <summary>
        /// m_Classes
        /// </summary>
        private IList<Class> classes = new List<Class>();

        /// <summary>
        /// Classes
        /// </summary>
        internal IList<Class> Classes
        {
            get { return this.classes; }
            set { this.classes = value; }
        }
    }

    /// <summary>
    /// class
    /// </summary>
    public class Class
    {
        /// <summary>
        /// m_Students
        /// </summary>
        private IList<Student> students = new List<Student>();

        /// <summary>
        /// Students
        /// </summary>
        internal IList<Student> Students
        {
            get { return this.students; }
            set { this.students = value; }
        }
    }

    /// <summary>
    /// 学生
    /// </summary>
    public class Student
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="Student"/> class.
        /// </summary>
        /// <param name="i">
        /// The i.
        /// </param>
        /// <param name="name">
        /// The name.
        /// </param>
        public Student(int i, string name)
        {
            this.Sex = i;
            this.Name = name;
        }

        /// <summary>
        /// 姓名
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// 性别
        /// </summary>
        public int Sex { get; set; }
    }
}
时间: 2024-11-08 23:54:40

Linq 常用方法解释的相关文章

java-String类常用方法解释笔记

参考注释即可. 1 /*H4ckSo1di3r 2015年2月4日 下午11:55:07*/ 2 package Demo; 3 4 public class TestStringClass_测试String类 { 5 6 7 public static void main(String[] args) { 8 9 // ================================================== 10 // 1.String类常用构造方法 11 //String() 无

c#学习系列之linq

一.揭开linq的神秘面纱 (一)概述 LINQ的全称是Language Integrated Query,中文译成"语言集成查询".LINQ作为一种查询技术,首先要解决数据源的封装,大致使用了三大组件来实现这个封装,分别是LINQ to Object.LINQ to ADO.NET.LINQ to XML.它们和.NET语言的关系如下: 要使用LINQ来编程,首先要学习使用LINQ的子句以及由查询语法构成的查询表达式.C#3.0和VB9开始将这种查询语法引入到了编程语言,并新增了一系

linq 总结

linq 常用方法: top   var query=(from u in User ...).Take(10) dblinq的坑: 时间必须当参数传入,否则会报错 多个left join时,如果join on进行类型转换时,放在最后面会报错,放到中间就没有问题

C#图解教程 第十九章 LINQ

LINQ 什么是LINQLINQ提供程序 匿名类型 方法语法和查询语法查询变量查询表达式的结构 from子句join子句什么是联结查询主体中的from-let-where片段 from子句let子句where子句 orderby子句select-group子句查询中的匿名类型group子句查询延续:into子句 标准查询运算符 标准查询运算符的签名查询表达式和标准查询运算符将委托作为参数LINQ预定义的委托类型使用委托参数的示例使用Lamba表达式参数的示例 LINQ to XML 标记语言XM

Java基础系列之(二) - 线程

一.线程的实现方式 1.继承Thread 2.实现Runnable接口 二.线程的状态 1.New(新生线程) 当你new一个Thread,newThread(r),这时处于线程的新生状态,此时程序还没有真正的运行. 2.Runnable(可运行的) 当启动start()方法时,此时线程处于可运行状态,不一定运行之中,这取决与线程是否得到CPU的运行时间片.事实上,一个线程并不是一直处于运行状态,偶尔需要被中断,让其他线程有运行的机会. 3.Blocked(被阻塞) 当发生以下情况被阻塞 -线程

一步一步学习SignalR进行实时通信_5_Hub

原文:一步一步学习SignalR进行实时通信_5_Hub 一步一步学习SignalR进行实时通信\_5_Hub SignalR 一步一步学习SignalR进行实时通信_5_Hub 前言 Hub命名规则 Hub封装好的常用方法 Hub常用方法解释 保持状态 前后台交互 结束语 参考文献 前言 上一讲,我们简单的介绍了下Hub的配置以及实现方法,这一将我希望把更多的细节梳理清楚,不至于让大家在细节上面摸不着头脑,理解深了,那么做项目自然就会相对轻松一些. Hub命名规则 Hub与Persistent

单元测试——junit

一.前言 JUnit4对于JUnit3来说是一个历史性的改革.因为JUnit4引入了注解(annotation),通过解析注解就可以为测试提供相应的信息,抛弃JUnit3使用命名约束以及反射机制的方法.但是JUnit4.x与JUnit3.8向后是兼容的. 官网:http://junit.org/junit4/ 预备知识点: 源文件夹:在eclipse中在项目中,右键新建选项中有一个源文件夹(Source folder).其与普通文件夹的不同点表现在,他的图标是十字型的包裹图案. 源文件夹的特点:

element使用心得

Table Table 常用属性解释 数据过滤,filter过滤器 <el-table-column width="200" show-overflow-tooltip label="检测指标"> <template slot-scope="scope"> {{ scope.row.projects | getIndex }} </template> </el-table-column> //上述,

GCD使用dispatch_semaphore_t创建多线程网络同步请求

一.简介: dispatch_semaphore_t:表示信号,生成信号的方法是 dispatch_semaphore_t semaphore= dispatch_semaphore_create(0); 其中参数0表示该新生成信号的总的信号量为0个. dispatch_semaphore_wait:信号等待,它像一个安保,比如小区规定最多只能进入3辆车,而进入一辆车后名额就会减少一个,当剩下的名额为0的时候,再有汽车说要进去时,就只能在外面等待了,直到有名额闲置出来了,才能开进小区. disp