zoukankan      html  css  js  c++  java
  • 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的子类,来实现自定义比较。

  • 相关阅读:
    翻转链表二
    最短路径算法
    在二叉树中插入节点
    LightOJ 1341
    串的基本操作
    链队列的基本操作
    LightOJ 1370
    poj 3060 Visible Lattice Points
    欧拉函数介绍及简单模板
    zoj 3593 One Person Game
  • 原文地址:https://www.cnblogs.com/dragon-L/p/6487153.html
Copyright © 2011-2022 走看看