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

 先看下ScottGu对In的扩展:

 

调用示例1:

 

调用示例2:

 

很多介绍扩展方法的也大都使用"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 扩展,使用调用代码更加简洁,同时也能减少编程中的误输入。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值