C# Linq源码解析之All

Posted dotNET跨平台

tags:

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

前言

在Dotnet开发过程中,All作为IEnumerable的扩展方法,十分常用。本文对Aggregate方法的关键源码进行简要分析,以方便大家日后更好的使用该方法。

使用

确定序列中的所有元素是否都满足条件,如果都满足就返回true,如果有一个不满足就返回false

有这样一段代码,我们判断集合中的元素的性别是否都为男,我们就可以使用linq中的all方法

public class UserInforMation
    
        public string UserName  get; set; 
        public string Sex  get; set; 
      
    
List<UserInforMation> lstUserInforMations = new List<UserInforMation> 
            new UserInforMation UserName="张三",Sex="男",
            new UserInforMation UserName="李四",Sex="男",
            new UserInforMation UserName="王麻子",Sex="男"
            ;
    
            bool flag = lstUserInforMations.All(o => o.Sex == "男");

我们查看ALL的原型

public static bool All<TSource> (this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,bool> predicate);
原型参数
  • 第一个参数是我们source 元素的类型

  • 第二个参数是一个委托,该委托用于判断所有元素是否满足某个条件

Func<TSource,bool> predicate

这个func委托接收一个和源元素相同的参数类型,并返回一个bool!

返回

可以看出该方法返回的一个bool变量,如果每个元素都满足func,或者序列为空,则为 true;否则为 false!

这样我们把All的原型理解完了,就能够很轻易的写出All的源码!

我们使用foreach遍历源元素,如果有一个不满足我们就返回false,因为这个方法的定义是序列中的所有元素是否都满足条件才返回True,否则返回false!

public static bool MyAll<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
        
            if (source == null)
            
                throw new Exception("source");
            

            if (predicate == null)
            
                throw new Exception("predicate");
            

            foreach (TSource item in source)
            
                if (!predicate(item))
                
                    return false;
                
            

            return true;
        

官方在这里埋了一个坑,官网对all有个说明,如果集合为空,这个方法也会返回true,所以我们在使用all的时候,一定要对集合判断是否含有元素,如果没有,就不要使用all了,这时候他返回的结果对于我们来说就是不对的了!看这样的一个例子

List<UserInforMation> lstUserInforMations2 = new List<UserInforMation>();
            bool flag = lstUserInforMations.All(o => o.Sex == "男");

这时候就是返回true,所以我们在使用前最好进行判空

List<UserInforMation> lstUserInforMations2 = new List<UserInforMation>();
            if (lstUserInforMations2.Any())
            
                bool flag = lstUserInforMations.All(o => o.Sex == "男");
            

当然有的人觉得这是个bug,那么对于聪明的你们来说来改造这个源码不是手到擒来吗?今天我的介绍就到此结束了,既然看到了这里,还麻烦给个赞!明天给大家带来Any的源码解析!

以上是关于C# Linq源码解析之All的主要内容,如果未能解决你的问题,请参考以下文章

C#-Linq源码解析之Average

C#-Linq源码解析之Any

C#-Linq源码解析之Concat

C#之linq

C# Linq ANY vs ALL - 性能 [关闭]

读书笔记 C# Linq查询之group关键字浅析