Linq限定操作之All,Any,Contains源码分析
Linq限定操作之All,Any,Contains源码分析
linq的限定操作
常见的限定操作: All,Any,Contains
一:All
1. 解释: 确定序列中的所有元素是否满足条件。
从字面意思上面,我们是否可以看到,避免我们写foreach语句。
static void Main(string[] args)
{
var nums = new int[] { 10, 20, 30, 40 };
var query = nums.All(i => i == 10);
}
2. 看源码:
//foreach (var num in nums)
//{
// if (num % 10 != 0)
// {
// return false;
// }
//}
//return true;
可以看到,果然和我自己实现的一模一样
二:Any 【bool】
1.解释: 确定序列是否包含任何元素。
2.代码:
foreach (var num in nums)
{
if (num == 20) return true;
}
return false;
三:Contains
1. 解释:通过使用默认的相等比较器确定序列是否包含指定的元素。
2. 相等比较器
也就是说只有比较器认为是相等的才能认为是相等。。
3. 源码实现
我们发现,Contains最终调用的是Array的IndexOf函数,而这种Contains实在SZArrayHelper中实现的。
private bool Contains<T>(T value)
{
return Array.IndexOf<T>(JitHelpers.UnsafeCast<T[]>(this), value) != -1;
}
4. 如何定义比较器
使用默认的比较器,一般用来操作“复杂类型”的比较。
namespace ConsoleApplication1
{
public class Program
{
static void Main(string[] args)
{
//只要名称相等,那么就认为两个类是相等的
var personList = new List<Person>() {
new Person() { Name="mary", Age=20 },
new Person() { Name="jack", Age=25 }
};
var b = personList.Contains(new Person() { Name = "mary", Age = 25 }, new MyComparer());
}
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
public class MyComparer : IEqualityComparer<Person>
{
public bool Equals(Person x, Person y)
{
return x.Name == y.Name;
}
public int GetHashCode(Person obj)
{
return obj.ToString().GetHashCode();
}
}
}
大家有应该清楚了,如何定义IEqualityComparer的子类,来实现自定义比较。
Linq限定操作之All,Any,Contains源码分析的更多相关文章
- Linq集合操作之Intersect,Except,Union源码分析
Linq集合操作之Intersect,Except,Union源码分析 linq的集合运算 常见的集合运算有哪些? 这三个扩展方法在我们实际使用中用的还是非常多的,而且这里还涉及到了“复杂度” 无算法 ...
- Linq转换操作之ToArray,ToList,ToDictionary源码分析
Linq转换操作之ToArray,ToList,ToDictionary源码分析 一:linq中的转换运算符 1. ToArray 我们经常用在linq查询上吧. linq只能运用在IEnumerab ...
- Linq分区操作之Skip,SkipWhile,Take,TakeWhile源码分析
Linq分区操作之Skip,SkipWhile,Take,TakeWhile源码分析 二:linq的分区操作 常用的分区操作:Take,TakeWhile,Skip,SkipWhile 三:Take ...
- HashMap在JDK1.8中并发操作,代码测试以及源码分析
HashMap在JDK1.8中并发操作不会出现死循环,只会出现缺数据.测试如下: package JDKSource; import java.util.HashMap; import java.ut ...
- 集合操作出现的ConcurrentModificationException(源码分析)
摘要: 为了保证线程安全,在迭代器迭代的过程中,线程是不能对集合本身进行操作(修改,删除,增加)的,否则会抛出ConcurrentModificationException的异常. 示例: publi ...
- 【集合框架】JDK1.8源码分析之LinkedList(七)
一.前言 在分析了ArrayList了之后,紧接着必须要分析它的同胞兄弟:LinkedList,LinkedList与ArrayList在底层的实现上有所不同,其实,只要我们有数据结构的基础,在分析源 ...
- 【JUC】JDK1.8源码分析之ConcurrentSkipListSet(八)
一.前言 分析完了CopyOnWriteArraySet后,继续分析Set集合在JUC框架下的另一个集合,ConcurrentSkipListSet,ConcurrentSkipListSet一个基于 ...
- 死磕 java集合之ArrayDeque源码分析
问题 (1)什么是双端队列? (2)ArrayDeque是怎么实现双端队列的? (3)ArrayDeque是线程安全的吗? (4)ArrayDeque是有界的吗? 简介 双端队列是一种特殊的队列,它的 ...
- 【JDK】JDK源码分析-HashMap(1)
概述 HashMap 是 Java 开发中最常用的容器类之一,也是面试的常客.它其实就是前文「数据结构与算法笔记(二)」中「散列表」的实现,处理散列冲突用的是“链表法”,并且在 JDK 1.8 做了优 ...
随机推荐
- CentOS7.6安装mailx
由于ECS服务器安全问题,发送邮件统一使用SSL模式 安装开始: 第一步:Yum安装mailx:yum install -y mailx 第二步: 创建证书存放目录(如以存在无需创建):mkdir - ...
- Django学习---CSRF
CSRF xss攻击:假设我们网站的评论里面允许用户写js的时候,每个人就会看到页面会执行这个js代码,有的是alert,不停的跳出弹框.这个还不算严重的,关键是如果js代码运行的结果不显示在页面上, ...
- mybatis No enum const class org.apache.ibatis.type.JdbcType.Date 坑爹的配置
转自:https://lihaiming.iteye.com/blog/2248059 在ibatis中不需要关注这些参数 而转到mybatis后 如果字段值为空 必须设置jdbcType如inser ...
- SpringData JPA示例
SpringData JPA只是SpringData中的一个子模块 JPA是一套标准接口,而Hibernate是JPA的实现 SpringData JPA 底层默认实现是使用Hibernate 1. ...
- UNITY 内存问题资料收集
1,https://blog.csdn.net/wetest_tencent/article/details/52130703 2,http://blog.51cto.com/13638120/208 ...
- 【310】◀▶ Python 日期和时间
参考: python 时间日期计算 Python 日期和时间(菜鸟教程) 8.1. datetime — Basic date and time types python中datetime模块中dat ...
- java aop 日志打印 正则设置
package tz.lion.Utils.aop; import com.alibaba.fastjson.JSON;import org.springframework.web.multipart ...
- Excel VBA入门(二)数组和字典
数组和字典也是VBA的常用到数据类型之一.但是我翻了有四五本VBA教程相关的书,里面都没有介绍到字典,数组到是在介绍数据类型时有介绍,而并没有提到字典. 事实上,字典不是VBA内置的类型,它是Wind ...
- Tp3.1 文件上传到七牛云
TP3.1 中不支持Composer 就无法用composer 安装 下载历史的SDK https://github.com/qiniu/php-sdk/releases/tag/v7.0.8 下载下 ...
- 技术串讲 CAS 有用
CAS,全称为Compare and Swap,即比较-替换.假设有三个操作数:内存值V.旧的预期值A.要修改的值B,当且仅当预期值A和内存值V相同时,才会将内存值修改为B并返回true,否则什么都不 ...