/// <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+5var 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+5var 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+5var 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否则返回 falsevar result = list.All(item => item.PageCount > 100);}/// <summary>/// 确定序列是否包含任何元素/// </summary>public static void Any(){var list = Book.Books;// 这个集合是否有元素 如果存在则有true 否则 返回falsevar result = list.Any();}/// <summary>/// 确定序列是否包含任何元素/// </summary>public static void Any1(){var list = Book.Books;// 这个集合中是否 包含的页数大于200页的元素 如果包含则返回true否则返回 falsevar 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 };// 序列是否包含 元素3bool 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类型的默认值 则为0var 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 listgroup p by p.Title into gselect new{g.Key,NumProducts = g.Count()};// 带条件计数var q1 = from p in listgroup p by p.Title into gselect new{g.Key,NumProducts = g.Count(p => p.PageCount > 200)};// Where限制var q2 = from p in listgroup p by p.Title into gwhere g.Count() >= 10select 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页的 并且索引大于2var 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; }}
}

转载于:https://www.cnblogs.com/liuxiaoji/p/4616466.html

Linq 常用方法解释相关推荐

  1. RabbitMQ探索:结构分析与常用方法解释

    为什么80%的码农都做不了架构师?>>>    前言:包的引入 首先,我们使用的是基于spring boot的rabbitMq, Maven地址 <parent>< ...

  2. HttpClient API常用方法

    HttpClient API常用方法解释: 1.1 请求执行HttpClient最重要的功能是执行HTTP方法.执行HTTP方法涉及一个或多个HTTP请求/ HTTP响应交换,通常由HttpClien ...

  3. 一文看懂Python(四)-----os.path模块篇

    一.前言 今天介绍一下Python中一个常用的模块–os.path模块.之后会很频繁地用到这个模块,故在分享一下! 二.常用方法解释 方法名 方法介绍 basename(path) 去掉目录路径,单独 ...

  4. java.lang包—类Class

    原文作者:一人浅醉- 原文地址:Java中的Class类 目录 生成Class对象的三种方式 Class常用方法解释 总结 Class 类是在Java语言中定义一个特定类的实现.一个类的定义包含成员变 ...

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

    目录 一步一步学习SignalR进行实时通信_5_Hub 前言 Hub命名规则 Hub封装好的常用方法 Hub常用方法解释 保持状态 前后台交互 结束语 参考文献 一步一步学习SignalR进行实时通 ...

  6. Java正则表达式的使用

    一.一些符号的释义 匹配符 [3-8]--->任意一个在3-8之间的数字.数字自己定. [a-z]--->任意一个小写的英文字母 [a-zA-Z0-9_]--->任意一个小写的英文字 ...

  7. Java并发相关知识(多线程、锁、容器、工具)

    目录 一.基础知识 线程之间如何通信? Java内存模型 内存屏障 顺序一致性 CAS实现原理 原子操作 volatile synchronized 实现原理 什么是锁 原子操作类说明 高性能原子类 ...

  8. JAVA入门万字总结

    由于图片上传问题,我将文件转化为PDF,这样既可以查看文章图片,也可以下载保存 https://download.csdn.net/download/peterbearXY/15289857 文章目录 ...

  9. java-集合框架库

    目录 集合框架库 0要点 0.1重点 0.2接口简要介绍 1Collection接口 1.1List接口 1.2Set接口 1.3Queue接口 2Map接口 2.0哈希表 2.1HashMap 2. ...

  10. JavaSE IO流 Vol.2 节点流 - 输入流 入门

    JavaSE IO流 Vol.2 节点流 - 输入流 入门 1. 前言 2. 节点流 - 输入流 结构体系 3. 节点流 - 输入流 ● InputStream · FileInputStream ● ...

最新文章

  1. python调用大华sdk
  2. NASM中SECTION的概念
  3. SQL Server 查询处理中的各个阶段(SQL执行顺序)
  4. 什么是电源正激和反激? 正激和反激有什么区别特点?如何快速区分
  5. *p++和*++p_2020年P气瓶充装新版试题及P气瓶充装找答案
  6. note_maven的pom.xml部分配置说明
  7. linux怎么给目录创建acl,LINUX-ACL文件访问控制列表
  8. 重磅福利!程序员面试——算法工程师面试大全第六部分
  9. python保存模型 drop_(长期更新)【python数据建模实战】零零散散问题及解决方案梳理...
  10. MySQL数据表类型及文件结构
  11. 机器人学习参考书籍目录整理
  12. 数学 - 基本初等函数导数公式及求导法则
  13. 虚幻引擎UE4背包系统(如何制作可拖动(Drag and Drop)的背包(Scrollbox))
  14. 20165220 我期望的师生关系
  15. SIP开源服务器kamalio安装教程
  16. sh文件加密解密gzexe(Cannot decompress $0)
  17. 通过VM虚拟机安装linux系统(centos版本)
  18. 2020年起重机司机(限门式起重机)多少分及格及起重机司机(限门式起重机)考试内容
  19. 潜伏在大厂中“摸鱼”的打工人
  20. Centos 7yum安装LAMP

热门文章

  1. 孤岛能源安卓游戏源码
  2. C#之SqlDependency数据库缓存
  3. MyEclipse发布项目更改项目名
  4. Sniffer安全技术从入门到精通
  5. 安装firefox扩展(xpi)文件的简便方法
  6. mysql求和 子查询_MySQL:子查询中的值总和
  7. C++常用基础函数整理
  8. endnotex7怎么导入中文文献,EndNote 7.0使用中文详细教程
  9. python反向查找字符_序列化使用(正向和反向查找)
  10. VI.Multidocument Transactions