LINQ

Posted 【我是谁】

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LINQ相关的知识,希望对你有一定的参考价值。

1、泛型参数命名规范
TSource,输入参数类型
TResult,输出参数类型
TKey,用于排序、分组、或者
2、OfType() 比如在Array集合中筛选出指定类型的数据
OfType()方法也用于筛选。 与其他运算符不同的是,OfType()定义在IEnumerable上,
而不是IEnumerable<T>,它的作用是从非泛型集合中筛选出某一类型的成员并返回
IEnumerable<T>。  因为OfType()返回的是IEnumerable<T>,所以返回的结果可以继续调
用其他的LINQ运算符  
3、Cast()  比如Array集合,我们把里面的数据全部转换为int类型,但是转换不成功会抛出异常
因为OfType()返回的是IEnumerable<T>,所以返回的结果可以继续调用其他的LINQ运算符  
4、调用Orderby还想继续排序就ThenBy()
5、Select()投影,可以直接投影new一个对象,但可以有个索引在里面进行操作
var query = col.Select((x, index) => new { Title = x.Name, Index = index}),
比如MVC网站的下拉列表填充数据:
IEnumerable<SelectListItem> list =
col.Select(x => new SelectListItem { Text = x.Name, Value = x.Code });  
6.Take()和Skip()   取和跳过,sql中的top可以为take,用于分页
7、TakeWhile()和SkipWhile() 如果是进行过排序的集合就有用了
取当条件不满足时继续,跳过不满足的。
int[] array = { 1, 2, 10, 4, 5};
var query = array.TakeWhile(x => x <= 5); // 输出1,2 
var query = array.SkipWhile(x => x <= 5); // 输出10,4,5  
8、Reverse()  反转序列
9、DefaultIfEmpty()  当序列为空时,DefaultIfEmpty()为序列添加一个元素,使用元素的默认值,或者指定元素的值,例如:  
 int[] array = { };
var query = array.DefaultIfEmpty(); // 输出0
var query2 = array.DefaultIfEmpty(100); // 输出100  
注意:因为int是值类型,默认值是0.当为类类型的时候,默认值为null,如果不指定一个值就会抛出未将对象引用到实例
10.Distinct()  去重
值类型:判断序列元素是否重复,需要元素实现IComparable<T>接口,值类型实现了这个接口。  
自定义类型:我们可以调用Distinct()的重载方法,传递一个IEqualityComparer<T>类型,它包含了对象比较的算法  ,因此,再建一个类PointComparer,让它去实现IEqualityComparer<T>接口:
public class PointComparer : IEqualityComparer<Point> {
public bool Equals(Point a, Point b) {
return a.X == b.X;
}p
ublic int GetHashCode(Point obj) {
return obj.X;
}
} 
 然后调用Distinct的重载方法,此时可以得到预期的结果:
 PointComparer cmp = new PointComparer();
var query = array.Distinct(cmp); // 得到1,2  
11.GroupBy()  
在T-SQL中,Group By只能和聚合函数一起搭配使用,返回的结果仍然是一个表(Flat)。 但是在LINQ中,GroupBy()的结果可以是一个树形结构,即序列中的元素也是一
个序列。  
 group  by 之后会产生一个key,key就是我们的分组ID’(item.key),之后再次循环item里面的值才是我们想要的对象:
 var query = col.GroupBy(x => x.Category);
foreach (var item in query) {//循环每个组
Console.WriteLine("<{0}>", item.Key);
foreach (var p in item) {//循序每个组的全部子集
Console.WriteLine(p.ToString());
}
}  
GroupBy()还包含一个重载方法,使用投影操作将TSource映射为其他类型  :
var query = col.GroupBy(x => x.Category,
x => new SelectListItem { Text = x.Code + x.Name,
Value = x.Price.ToString() }); 
获取数据的操作跟我们之前的一样 。SelectListItem 可以是任意类型,比如匿名
12.Intersect()和Except() 
 Intersect()返回两个序列中相同元素构成的序列。对于自定义类型来说跟PointComparer 类一样:
 int[] array1 = { 0, 1, 2 };
int[] array2 = { 2, 3, 4 };
var query = array1.Intersect(array2); // 得到 2  
 Except()与Intersect()相反,返回第一个序列中有而第二个序列中没有的元素:
 var query = array1.Except(array2); // 得到 0,1
 13.Concat()和Union()
Concat()运算符用于连接两个序列。   
Union()运算符也用于连接两个序列,但是会剔除相同的项目 
 var query = array1.Concat(array2); // 得到 0,1,2,2,3,4
 var query = array1.Union(array2); // 得到 0,1,2,3,4
5.4.2 返回其他序列类型  
 ToArray()、 ToList()、 ToDictionary()、 ToLookUp()四个方法用于将IEnumerable<T>转换为相应的类型。 在转换时,会执行遍历,因此这几个方法都是立即执行的,没有进行延时加载。  
 5.4.3 返回序列中元素
 1.ElementAt()和ElementAtOrDefault()
 ElementAt()以序列中元素的位置作为参数,返回该元素。 如果元素不存在,则抛出异常。   
ElementAtOrDefault()在元素不存在时返回该类型的默认值。 对于引用类型来说,其默
认值为null。  int类型为0,因为是返回默认值,所以不会抛出异常
 2.First()和FirstOrDefault()
First()和Where()类似,只不过First()返回满足条件的第一个序列元素,而Where()返回
所有满足条件的序列元素。 当元素不存在时,First()会抛出异常,而FirstOrDefault()返回元素的默认值(没有返回null)
int[] array = { 1, 2, 3, 4 };
int item = array.First(x => x %2 == 0); // 得到 2
int item2 = array.First( x => x==10); // 异常:序列不包含任何匹配元素
int item3 = array.FirstOrDefault(x=>x==10); // 得到 0  
 当不传递参数时,First()返回序列中的首个元素:
 int item = array.First(); // 得到1
 3.Last()和LastOrDefault()  跟上面的相反
 4.Single()和SingleOrDefault()
 Single()与First()类似,只不过Single()要求序列中有且只有一个满足条件的项,如果满足条件的有两项,则会抛出异常。 SingleOrDefault()要求有一个或零个满足条件的项,当满
足条件的项为零个时,返回默认值:  
int[] array = { 1, 2, 2, 3 };
int item2 = array.Single(x => x == 2); // 异常:序列中包含一个以上的元素
int item3 = array.SingleOrDefault(x => x == 10); // 得到0  
 Single()还有一个不包含任何查询条件的重载,当序列中有且仅有一个元素时,返回该元素,否则抛出异常:  
 int[] array = { 1 };
int item = array.Single(); // 得到 1
int[] array2 = { 1, 2 };
int item2 = array2.Single(); // 抛出异常:序列中包含一个以上的元素  
5.4.4 返回标量值  
1.Count()和LongCount()  
这两个方法用于返回序列中的元素数目,不同的是Count()返回int类型,而LongCount()返回long类型。 
2.Max()、 Min()、 Average()和Sum()
从名称就可以看出这几个方法的用意,Max()返回序列中最大的项,Min()返回序列中最
小的项,Average()返回序列中各项的平均值,Sum()返回序列中各项的总和: 
 3.Aggregate()
Aggregate()运算符用于返回自定义的聚合,例如,可以将序列中每个元素乘以2,再将
它们相加起来:  
 int[] array = { 2, 3, 5 };
int sum = array.Aggregate(0, (total, x) => total + (x * 2));
Console.WriteLine(sum)  
上面的0是total的初始值,total是运算后的结果,Lambda表达式为运算的方法,上面
的代码相当于:  
int[] array = { 2, 3, 5 };
int total = 0;
foreach (int x in array) {
total = total + (x * 2);
}i
nt sum = total;
Console.WriteLine(sum); 
 4.Contains()、 Any()、 All()和SequenceEqual()
这4个方法都返回bool类型,用作条件判断 :
 Contains()判断某一个元素是否存在于序列中
Any()判断序列中是否存在满足表达式的元素,只要有一个元素满足,则返回True。 当
调用无参数的重载方法时,Any()用于判断序列中是否包含元素。  
 All()判断序列中所有的元素是否都满足表达式,只要有一个元素不满足,则返回
False。  
SequenceEqual(),用于逐项比较两个序列,当两个序列中的元素数目相同,并且序列
中相同位置的元素也相同时,返回True,否则返回False:  
int[] array = { 0, 1, 2 };
int[] array2 = { 0, 1, 2, 3 };
int[] array3 = { 0, 1, 2 };
var query = array.SequenceEqual(array2); // False
var query2 = array.SequenceEqual(array3); // True 
 5.4.5 其他方法
 还有一些方法,它们也定义在System.Linq.Enumerable类中,却不是扩展方法,只是普通的静态方法,因此,只能在Enumerable类上调用。  
 Empty()用于创建一个空的序列,由泛型参数指定序列的元素类型:
IEnumerable<string> list1 = Enumerable.Empty<string>(); //创建一个空的string序列
IEnumerable<int> list2 = Enumerable.Empty<int>(); //创建一个空的int序列
Console.WriteLine(list1.Count()); // 0
list1的实际类型可以通过调用GetType().FullName来获得:
Console.WriteLine(list1.GetType().FullName); // System.String[]
Range()方法只能用于int类型,用于生成由连续数字构成的序列,序列中的元素依次加
1:
IEnumerable<int> seq = Enumerable.Range(0, 3); // 0,1,2,常跟select用于代替循环的操作
Repeat()方法与Range()类似,只不过用于生成重复的数字:
IEnumerable<int> seq = Enumerable.Repeat(0, 3); // 0,0,0  

  

以上是关于LINQ的主要内容,如果未能解决你的问题,请参考以下文章

并行LINQ PLinq

C#图解教程 第十九章 LINQ

ASP.NET MVC4.0+EF+LINQ+bui+网站+角色权限管理系统

解决未能加载文件或程序集“Newtonsoft.Json ...."或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)(代码片段

“系统”-代码到“System.Linq”-代码

在ASP.NET MVC的Action中直接接受客户端发送过来的HTML内容片段