/// <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. [LeetCode] 804. Unique Morse Code Words_Easy tag: Hash Table

    International Morse Code defines a standard encoding where each letter is mapped to a series of dots ...

  2. Bootstrap 网格系统(Grid System)的工作原理 - 媒体查询

    媒体查询 媒体查询是非常别致的"有条件的 CSS 规则".它只适用于一些基于某些规定条件的 CSS.如果满足那些条件,则应用相应的样式. Bootstrap 中的媒体查询允许您基于 ...

  3. 你应该知道的最好Webmail邮件客户端,

    1 . Kite Kite is an opensource replacement to Gmail. Kite is a webmail designed to look a lot like g ...

  4. Git 全局设置

    Git 全局设置: git config --global user.name "ASxx" git config --global user.email "123456 ...

  5. JS中“==”和“===”的原理和区别

    1.为什么讨论这个问题? - 有个说法,尽量不用==,而使用===,是这样吗? 2.分析问题,原理是什么? 下面说说ECMAScript 5 language specification里的说明: 1 ...

  6. Linux系统——LNMP分离式部署

    #### 安装nginx ```[root@localhost ~]# tar xf nginx-1.10.2.tar.gz -C /usr/src/[root@localhost ~]# cd /u ...

  7. 剑指offer4

    中序遍历(LDR)是二叉树遍历的一种,也叫做中根遍历.中序周游.在二叉树中,先左后根再右.巧记:左根右. 现在有一个问题,已知二叉树的前序遍历和中序遍历:PreOrder:         GDAFE ...

  8. STA分析(一) setup and hold

    timing check可以分为Dynamic Timing Analysis(Post_sim)和Static Timing Analysis STA:可以分析的很全面:仿真速度也很快:可以分析控制 ...

  9. EditPlus 5.1.2066 中文版(1月30日修正)

    之前有一些网友反馈汉化版的 EditPlus 中翻页键无法正常工作.经过调查,发现是翻译工具的问题. 因此,我用新的工具重新翻译了 EditPlus.翻页键在新中文版中应该可以正常工作了. 有需要的网 ...

  10. python3.4学习笔记(二十一) python实现指定字符串补全空格、前面填充0的方法

    python3.4学习笔记(二十一) python实现指定字符串补全空格.前面填充0的方法 Python zfill()方法返回指定长度的字符串,原字符串右对齐,前面填充0.zfill()方法语法:s ...