/// <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();
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();
var result = numbers.Aggregate<int, int>(, (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();
var result = numbers.Aggregate<int, int, int>(, (a, b) => a + b, rel => rel - );
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 > );
} /// <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 > );
} /// <summary>
/// 计算可以为 null 的 System.Decimal 值序列的平均值。
/// </summary>
public static void Average1()
{
var numbers = GetArray(); // 平均值
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("");
arraylist.Add("");
arraylist.Add("");
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> { , , , , };
var b = new List<int> { , , , , };
/*
* 那么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> { , , , , }; // 序列是否包含 元素3
bool rel = a.Contains(); 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> { , , , , };
var rel = a.Distinct();
} /// <summary>
/// 返回序列中指定索引处的元素。
/// </summary>
public static void ElementAt()
{
IEnumerable<int> a = new List<int> { , , , , }; // 返回索引为3的元素
var rel = a.ElementAt(); // 返回序列中指定索引处的元素;如果索引超出范围,则返回默认值。
// int类型的默认值 则为0
var rel1 = a.ElementAtOrDefault();
} /// <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 > )
}; // Where限制
var q2 = from p in list
group p by p.Title into g
where g.Count() >=
select new
{
g.Key,
NumProducts = g.Count(p => p.PageCount > )
}; // 多列(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 > } 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 = ; i < ; i++)
{
s.Classes.Add(new Class());
}
s.Classes[].Students.Add(new Student(, "a0"));
s.Classes[].Students.Add(new Student(, "b0"));
s.Classes[].Students.Add(new Student(, "c0"));
s.Classes[].Students.Add(new Student(, "d0"));
s.Classes[].Students.Add(new Student(, "e0"));
s.Classes[].Students.Add(new Student(, "a1"));
s.Classes[].Students.Add(new Student(, "a1"));
s.Classes[].Students.Add(new Student(, "a2"));
s.Classes[].Students.Add(new Student(, "a3"));
s.Classes[].Students.Add(new Student(, "b1"));
s.Classes[].Students.Add(new Student(, "c1"));
s.Classes[].Students.Add(new Student(, "d1")); // 取出school下的所有性别是0的student
var x = s.Classes.SelectMany(b => b.Students).Where(i => i.Sex == );
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(); // 只要满足指定的条件,就跳过序列中的元素,然后返回剩余元素。
var rel1 = list.SkipWhile(iem => iem.PageCount < ).ToList(); // 返回前2个元素
var rel2 = list.Take(); // 只要满足指定的条件,就会返回序列的元素。
var rel3 = list.TakeWhile(w => w.PageCount < ).ToList();
} /// <summary>
/// 查询
/// </summary>
public static void Where()
{
var list = Book.Books; // 页码大于2000页的
var rel = list.Where(w => w.PageCount > ); // 页码大于2000页的 并且索引大于2
var rel1 = list.Where((a, b) => a.PageCount > && b > );
} /// <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 ;
}
else if (x.Length < y.Length)
{
return -;
} return ;
}
} /// <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 = ; i < max; i++)
{
result.Add(i + );
}
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 = },
new Book { Title = "MVC", PageCount = },
new Book { Title = "ASP.NET", PageCount = },
new Book { Title = "java", PageCount = },
new Book { Title = "jquery", PageCount = },
};
}
}
} /// <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; }
}
}

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

  1. Newtonsoft.Json.Linq 常用方法总结

    目录 1.Entity to Json 1.1.准备工作 1.2.Entity to Json 1.3.Json to Entity 2.Linq To Json 2.1.创建对象 2.2.从 Jso ...

  2. linq——常用方法

    take  前几 skip   跳过前几 takeWhile   var firstNumbersLessThan6 = numbers.TakeWhile(n => n < 6);  / ...

  3. 那天有个小孩跟我说LINQ(四)转载

    1  LINQ TO SQL(代码下载)       我们以一个酒店管理系统的数据库为例子         表结构很简单:GuestInfo(客人信息表),Room(房间表),RoomType(房间类 ...

  4. linq 总结

    linq 常用方法: top   var query=(from u in User ...).Take(10) dblinq的坑: 时间必须当参数传入,否则会报错 多个left join时,如果jo ...

  5. C#图解教程 第十九章 LINQ

    LINQ 什么是LINQLINQ提供程序 匿名类型 方法语法和查询语法查询变量查询表达式的结构 from子句join子句什么是联结查询主体中的from-let-where片段 from子句let子句w ...

  6. LINQ 系列

    C#图解教程 第十九章 LINQ   LINQ 什么是LINQLINQ提供程序 匿名类型 方法语法和查询语法查询变量查询表达式的结构 from子句join子句什么是联结查询主体中的from…let…w ...

  7. 进阶系列(9)——linq

    一.揭开linq的神秘面纱(一)概述  LINQ的全称是Language Integrated Query,中文译成“语言集成查询”.LINQ作为一种查询技术,首先要解决数据源的封装,大致使用了三大组 ...

  8. 什么是LINQ

    LINQ 什么是LINQLINQ提供程序 匿名类型 方法语法和查询语法查询变量查询表达式的结构 from子句join子句什么是联结查询主体中的from…let…where片段 from子句let子句w ...

  9. Java Class类常用方法描述

    一 生成Class对象的三种方式 1 Class.forName("全路径名") 2  类名.Class 3 实例对象.getClass() 接着看三种方式生成Class对象的区别 ...

随机推荐

  1. 使用免费的Let's Encrypt通配符证书 升级我们的网站

    Let's Encrypt通配符证书的官方启用日期:2018年3月13日 也就是说,2018年3月13日之后,我们就可以使用Let's Encrypt通配符证书了,当然是免费的. Let's Encr ...

  2. [LeetCode] 232. Implement Queue using Stacks_Easy tag: Design

    Implement the following operations of a queue using stacks. push(x) -- Push element x to the back of ...

  3. Locust性能测试5-参数化批量注册

    前言 实现场景:所有并发虚拟用户共享同一份测试数据,并且保证虚拟用户使用的数据不重复. 例如,模拟10用户并发注册账号,总共有100个手机号,要求注册账号不重复,注册完毕后结束测试 准备数据 虚拟用户 ...

  4. iOS 网易彩票-4设置模块一

    概述 基本上,每一款APP都有相应的设置模块.怎么设置才能更灵活和通用呢,这也是大家一直思考的.下面说说在网易彩票中,设置模块的设置思想. 基本上有三种方案: static cell(呆板,完全没有动 ...

  5. Typecho博客让文章列表页只显示摘要的方法

    在当前主题的 index.php 文件中找到代码 <?php $this->content('阅读剩余部分...'); ?> 将其替换为 <?php $this->exc ...

  6. 我的2015年ccf的解答

    只做了前三个题,在本地调试好了,不知为什么错了,好歹做了那么久,就记录一下了(注:这不是标准答案,只是我给出的解答) 这是第一题的代码: #include<stdio.h> #includ ...

  7. app的底部菜单设计

    一.个人看法. 1.一般都是四个菜单或者五个菜单,这个是绝对主流,我估计占比达99%.当然也有三个菜单图标的,也有零个菜单图标的 2.如果该app软件功能复杂,那么尽量选择5个图标布局.比如苹果app ...

  8. strus2 框架介绍

    strus2 执行过程: ActionMapper会去找ActionMapping查找URL请求的映射 1:ActionMapping这个类用name+namespace确定请求的映射, (但是仍然不 ...

  9. MFC用串行化实现文档存储和读取功能

    在面向对象的程序设计中,一般都是用二进制文件来保存文档资料.在VC++中控制和使用文件流的方法很多,MFC程序设计中常用的有两种方法:用CFile对象存储和读取文件:利用串行化存取文件.其中用CFil ...

  10. SQL Server 运行状况监控SQL语句

    Microsoft SQL Server 2005 提供了一些工具来监控数据库.方法之一是动态管理视图.动态管理视图 (DMV) 和动态管理函数 (DMF) 返回的服务器状态信息可用于监控服务器实例的 ...