/// <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. pandas.drop/isnull/fillna/astype的用法

    删除表中的某一行或者某一列更明智的方法是使用drop,它不改变原有的df中的数据,而是返回另一个dataframe来存放删除后的数据. (1)清理无效数据 df[df.isnull()] #返回的是个 ...

  2. windows下编译和安装boost库

    boost是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库. 获取方式 boost提供源码形式的安装包,可以从boost官方网站下载,目前最新版本是1.59.0. 本机上正好有boos ...

  3. MQTT协议学习研究 & Mosquitto简要教程(安装和使用)

    若初次接触MQTT协议,可先理解以下概念: [MQTT协议特点]——相比于RESTful架构的物联网系统,MQTT协议借助消息推送功能,可以更好地实现远程控制. [MQTT协议角色]——在RESTfu ...

  4. js模拟电梯操作

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. img height test

  6. memcache分布式布置方案

    利用hash算法 key->hash->取余%2 mod ->server=array()=>server[mod]算出是第几个memcache服务器

  7. 74. Search a 2D Matrix(二分查找,剑指offer 1)

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  8. VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)

    上一节讲了标签控件Tab Control以后,常用控件的内容就全部讲完了,当然并没有包括所有控件,主要是一些很常用很重要的控件.本节开始鸡啄米将为大家讲解菜单的概念及使用. 菜单简介 菜单在界面设计中 ...

  9. bootstrap实战教程

    bootstrap实战教程 bootstrap介绍 简介 Bootstrap 是最受欢迎的 HTML.CSS 和 JS 框架,用于开发响应式布局.移动设备优先的 WEB 项目.全球数以百万计的网站都是 ...

  10. 关于阿里云专有网络搭建FTP服务器的深坑

    之前用的FTP服务器都是,随便搭建一下就能用了, 昨天因为服务器的问题,换了个服务器,搭建FTP服务器的时候发现, 搭建的服务器居然只能使用 主动模式访问,改成被动后 无法获取目录, 百度了 各大论坛 ...