关于Linq使用过程中遇见的一些小疑点的总结

关于Linq使用过程中遇见的一些小问题的总结

使用First()/FirstOrDefault()Last()/LastOrDefault()方法返回序列中第一个或者最后一个元素时,应该确保序列已经被正确排序。

int[] numbers = { 3, 1, 23, 10, 5, 12, 7, 2, 4};
int first = numbers.First(); //输出3
int firstOrdered = numbers.OrderBy(it => it).First();//输出1
从示例代码可以看出,对未正确排序的序列使用First()/FirstOrDefault()Last()/LastOrDefault()方法将无法返回自己想要的结果。


了解方法First()FirstOrDefault()、方法Last()LastOrDefault()之间的区别

FirstOrDefault()First()方法都可以返回序列中的第一个元素。两者的区别是:如果序列中不包含任何元素,FirstOrDefault()会返回默认值,而First()方法将会引发异常。Last()LastOrDefault()方法之间的区别与FirstOrDefault()First()方法之间的区别相同。

int[] numbers = { 3, 1, 23, 10, 5, 12, 7, 2, 4};
int first = numbers.First(it=>it == 30);//会产生异常
int firstOrDefault = numbers.FirstOrDefault(it => it == 30);//返回0

3 使用Where()+First()/FirstOrDefault()的某些场合可以只用First()/FirstOrDefault()来实现

我们可以使用Where()方法来筛选序列,再使用First()/FirstOrDefault()方法返回筛选后的序列中的第一个元素,其实这样的操作我们完全可以使用First()/FirstOrDefault()方法来实现。因为First()/FirstOrDefault()方法提供的重载形式First<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)/FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)可以返回序列中满足条件的第一个元素。(Where()+Last()/LastOrDefault()--Last()/LastOrDefault()类似

int[] numbers = { 3, 1, 23, 10, 5, 12, 7, 2, 4};
int first1 = numbers.Where(it => it > 5).First(); //返回23
int first2 = numbers.First(it => it > 5);//返回23

4 了解Where()方法与Select()方法的区别

Select()方法可以将序列中的每个元素投影到新表中,结果为一个新的集合。而Where()方法仅基于谓词筛选序列,结果为源序列的一个子集。     

int[] numbers = { 3, 1, 23, 10, 5, 12, 7, 2, 4};
var where = numbers.Where(it => it > 5).ToList(); //返回23, 10, 12, 7
var query = numbers.Select(it => it * it).ToList(); //返回9, 1, 529, 100, 25, 144, 49, 4, 14
 

两次OrderBy()OrderBy()+ThenBy()的结果并不一样

请参考文章《排序操作中的小陷阱》。


了解Take()Skip()方法的区别

请参考文章《例说Linq中Take与Skip的使用》。


使用Contains方法判断集合中是否包含有某些元素

int[] numbers = { 3, 1, 23, 10, 5, 12, 7, 2, 4};
int[] conditions = { 1, 10, 4, 68 };
var results = numbers.Where(it => conditions.Contains(it)).ToList(); //返回1, 4, 10