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的子类,来实现自定义比较。

原文地址:https://www.cnblogs.com/dragon-L/p/6487153.html