先看下ScottGu对In的扩展:

调用示例1:

调用示例2:

原文地址:New "Orcas" Language Feature: Extension Methods
很多介绍扩展方法的也大都使用"In"作为例子,但很少有人再深入想一步。个人感觉这个In扩展的不够彻底,试看如下代码:
        public static void Example1()
        {
            bool b1 = 1.In(new int[] { 1, 2, 3, 4, 5 });
            bool b2 = "Tom".In(new string[] { "Bob", "Kitty", "Tom" });
        }

//ScottGu In扩展
        public static bool In(this object o, IEnumerable c)
        {
            foreach (object i in c)
            {
                if (i.Equals(o)) return true;
            }
            return false;
        }

每次使用 In 时都要声明一个数组(或集合),有点麻烦,如果像下面这个样子调用应该比较简单一些:

        public static void Example2()
        {
            bool b1 = 1.In(1, 2, 3, 4, 5);
            bool b2 = 1.In(1, 2, 3, 4, 5, 5, 7, 8);
            bool b3 = "Tom".In("Bob", "Kitty", "Tom");
            bool b4 = "Tom".In("Bob", "Kitty", "Tom", "Jim");
        }

感觉如何,是否有点类似SQL中的In?

如何扩展的呢,很简单,这里使用了 params 这个“方法参数关键字”(MSDN中名字),还是看代码吧!
通过 params 我们不必再显式声明数组了,省了不少“笔墨”。

        //ScottGu In扩展 改进
        public static bool In(this object o, params object[] c)
        {
            foreach (object i in c)
                if (i.Equals(o)) return true;
            return false;
        }

上面一直是对 object 进行扩展,但存在一个很大的隐患,你的代码可能会不注意写成以下的样子

        public static void Example3()
        {
            string name = "Application1";

string name1 = "Bob";
            string name2 = "Kitty";
            string name3 = "Tom";
            string s = "Tom";
            bool b1 = s.In(name1, name2, name3);
            bool b2 = s.In(name1, name2, name, 3);//不注意加了个小逗号
        }

编译,照样运行,出了错很难查找原因。幸好我们c#有泛型,最后改进一次:

        //ScottGu In扩展 改进
        public static bool In<T>(this T t, params T[] c)
        {
            return c.Any(i => i.Equals(t));
        }

再编译,通不过了,报错如下:

问题解决了。

技术总结:我们使用 params 和 泛型改进了 ScottGu 的 In 扩展,使用调用代码更加简洁,同时也能减少编程中的误输入。
思想总结:网上好多文章都是转来转去,没有自己的想法,其它只要深入想一步,会有很多新发现。

《c#扩展方法奇思妙用》是个专题,包含很多方面的应用,请保持关注!谢谢!

转载于:https://www.cnblogs.com/China-Dragon/archive/2010/05/12/1733472.html

C#扩展方法奇思妙用高级篇一:改进 Scottgu 的 In 扩展相关推荐

  1. c# 扩展方法奇思妙用高级篇五:ToString(string format) 扩展

    在.Net中,System.Object.ToString()是用得最多的方法之一,ToString()方法在Object类中被定义为virtual,Object类给了它一个默认实现: 1     p ...

  2. c#扩展方法奇思妙用高级篇七:“树”通用遍历器

    我的上一篇随笔<c#扩展方法奇思妙用高级篇六:WinForm 控件选择器>中给出了一个WinForm的选择器,其实质就是一个"树"的遍历器,但这个遍历局限于WinFor ...

  3. c# 扩展方法奇思妙用高级篇一:改进 Scottgu 的 In 扩展

    先看下ScottGu对In的扩展: 调用示例1: 调用示例2: 原文地址:New "Orcas" Language Feature: Extension Methods 很多介绍扩 ...

  4. c#扩展方法奇思妙用高级篇四:对扩展进行分组管理

    从系列文章开篇到现在,已经实现的很多扩展了,但过多的扩展会给我们带来很多麻烦,试看下图: 面对这么多"泛滥"的扩展,很多人都会感到很别扭,的确有种"喧宾夺主"的 ...

  5. c#扩展方法奇思妙用高级篇八:Type类扩展

    Type 类提供了大量的属性和方法,但在一些基础性开发工作中,Type类功能还有些欠缺,尤其上在处理泛型类型时,如可空类型和泛型集合类型.下面的类就针对这些地方进行扩展.  1     public  ...

  6. c# 扩展方法奇思妙用高级篇六:WinForm 控件选择器

    在Web开发中,jQuery提供了功能异常强大的$选择器来帮助我们获取页面上的对象.但在WinForm中,.Net似乎没有这样一个使用起来比较方便的选择器.好在我们有扩展方法,可以很方便的打造一个. ...

  7. c# 扩展方法奇思妙用基础篇八:Distinct 扩展(转载)

    转载地址:http://www.cnblogs.com/ldp615/archive/2011/08/01/distinct-entension.html 刚看了篇文章 <Linq的Distin ...

  8. c# 扩展方法奇思妙用变态篇四:string 的翻身革命

    string是各种编程语言中最基础的数据类型,长期以来受尽其它类的压迫,经常被肢解(Substring.Split).蹂躏(Join)... 而现在string要"翻身闹革命"了, ...

  9. c#扩展方法奇思妙用变态篇四:string 的翻身革命

    string是各种编程语言中最基础的数据类型,长期以来受尽其它类的压迫,经常被肢解(Substring.Split).蹂躏(Join)... 而现在string要"翻身闹革命"了, ...

最新文章

  1. java对比python的优势_Java相比Python3有哪些优势?
  2. 电气论文实现:深度学习分位数回归实现电力负荷区间预测
  3. 创建线程的方式_创建线程有几种不同的方式?
  4. 【转】mysql锁表解决方法
  5. Python+Visual Studio
  6. VUE基础(躺着都能会)
  7. W3school中js学习
  8. SQL Server 2005系列教学(12) 导入导出服务
  9. 24c存储器读写软件_必知必会-存储器层次结构
  10. “微信之父”张小龙:微信背后的产品观
  11. 置换检验 配对秩和检验
  12. Java 嵌入数据处理引擎:SQLite 的挑战者
  13. java基础-对15位或18位身份证号码的验证
  14. 2017年计算机二级有什么好处,2017年计算机二级考试备考的五大法宝
  15. VUE大屏可视化实战
  16. SqlServer 数据库修复
  17. jupyter能debug了,使用vscode的jupyter插件进行debug
  18. 干货来了,这些物联网基础知识你了解吗
  19. 商城后台管理系统学习日志-01
  20. 【Java】有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?

热门文章

  1. 「CSS」常见的清除浮动方法
  2. JavaScript数据结构——树(Tree)
  3. ionic2+启动白屏问题-------之补充解决之道
  4. 哪些事情瞬间暴露了你的贫穷?
  5. 有多少人自驾过独库公路?
  6. 肌肉男比常人多了哪些烦恼?
  7. 在哪一瞬间,你意识到那个人不能深交?
  8. 炒股如果亏损一直买入可行吗
  9. 2021年是“三蛇闹春,十鼠抢粮,十一牛耕田”,啥意思?
  10. 职业年金退休能拿多少?怎么算的?