zoukankan      html  css  js  c++  java
  • yield return的使用。。。

    因为要取两个集合不同的元素,所以写了个拓展方法,用到了yield这个关键字,然后就学习了一波。先上代码

       public static IEnumerable<T> NoRetainAll<T>(this IList<T> source, IList<T> compareSource)
            {
                foreach (var info in source)
                {
                    if (!compareSource.Contains(info)) yield return info;
                }
            } 

    yield return与return的区别

    返回值类型:  

      return 可以返回任意类型T;

      yield return 只能返回IEnumerable<T>类型,总是个可枚举的对象,yield return 后面的表达式为T类型。如果没有元素,也会返回一个count=0的IEnumerable<T>结果,所以不会出现NULL

    程序控制流程不同:

      return 语句使方法返回,后面再有语句都不执行了。

      yield return 则不会使方法返回,继续执行后面的语句,只是计算记录最终返回的可枚举对象的一个元素值

    这篇文章介绍的两者的区别还挺详细https://www.cnblogs.com/fanyf/p/4565385.html

    上述方法参数为什么要用IList<T>作类型了,因为用IEnumerable<T>,编译器里面的Reshaper警告提示  Possible multiple enumeration of IEnumerable 

    这篇文章介绍了原因https://blog.csdn.net/aixun4106/article/details/101972058,还给出了例子,

    分析:如果对IEnumerable多次读取操作,会有因数据源改变导致前后两次枚举项不固定的风险,最突出例子是读取数据库的时候,第二次foreach时恰好数据源发生了改变,那么读取出来的数据和第一次就不一致了。

    解决方案:多次使用IEnumerable时,最好转换为List或者Array

    个人理解:IEnumerable相当于懒加载,就是数据不是一次性到内存里面的,而List是一次性到内存当中的,所以IEnumerable可能会改变,而List不会改变

  • 相关阅读:
    视图类
    基于前一天再补充
    多表与基表等概念
    模块与序列化
    vue简单实现购物车列表功能
    再顾vue
    再探vue
    iptables编辑
    python 字符串替换、正则查找替换
    Map的遍历
  • 原文地址:https://www.cnblogs.com/huage-1234/p/12009472.html
Copyright © 2011-2022 走看看