C#扩展方法奇思妙用高级篇一:改进 Scottgu 的 In 扩展
调用示例1:
调用示例2:
原文地址:New "Orcas" Language Feature: Extension Methods
{
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 时都要声明一个数组(或集合),有点麻烦,如果像下面这个样子调用应该比较简单一些:
{
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 我们不必再显式声明数组了,省了不少“笔墨”。
public static bool In(this object o, params object[] c)
{
foreach (object i in c)
if (i.Equals(o)) return true;
return false;
}
上面一直是对 object 进行扩展,但存在一个很大的隐患,你的代码可能会不注意写成以下的样子
{
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#有泛型,最后改进一次:
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 扩展相关推荐
- c# 扩展方法奇思妙用高级篇五:ToString(string format) 扩展
在.Net中,System.Object.ToString()是用得最多的方法之一,ToString()方法在Object类中被定义为virtual,Object类给了它一个默认实现: 1 p ...
- c#扩展方法奇思妙用高级篇七:“树”通用遍历器
我的上一篇随笔<c#扩展方法奇思妙用高级篇六:WinForm 控件选择器>中给出了一个WinForm的选择器,其实质就是一个"树"的遍历器,但这个遍历局限于WinFor ...
- c# 扩展方法奇思妙用高级篇一:改进 Scottgu 的 In 扩展
先看下ScottGu对In的扩展: 调用示例1: 调用示例2: 原文地址:New "Orcas" Language Feature: Extension Methods 很多介绍扩 ...
- c#扩展方法奇思妙用高级篇四:对扩展进行分组管理
从系列文章开篇到现在,已经实现的很多扩展了,但过多的扩展会给我们带来很多麻烦,试看下图: 面对这么多"泛滥"的扩展,很多人都会感到很别扭,的确有种"喧宾夺主"的 ...
- c#扩展方法奇思妙用高级篇八:Type类扩展
Type 类提供了大量的属性和方法,但在一些基础性开发工作中,Type类功能还有些欠缺,尤其上在处理泛型类型时,如可空类型和泛型集合类型.下面的类就针对这些地方进行扩展. 1 public ...
- c# 扩展方法奇思妙用高级篇六:WinForm 控件选择器
在Web开发中,jQuery提供了功能异常强大的$选择器来帮助我们获取页面上的对象.但在WinForm中,.Net似乎没有这样一个使用起来比较方便的选择器.好在我们有扩展方法,可以很方便的打造一个. ...
- c# 扩展方法奇思妙用基础篇八:Distinct 扩展(转载)
转载地址:http://www.cnblogs.com/ldp615/archive/2011/08/01/distinct-entension.html 刚看了篇文章 <Linq的Distin ...
- c# 扩展方法奇思妙用变态篇四:string 的翻身革命
string是各种编程语言中最基础的数据类型,长期以来受尽其它类的压迫,经常被肢解(Substring.Split).蹂躏(Join)... 而现在string要"翻身闹革命"了, ...
- c#扩展方法奇思妙用变态篇四:string 的翻身革命
string是各种编程语言中最基础的数据类型,长期以来受尽其它类的压迫,经常被肢解(Substring.Split).蹂躏(Join)... 而现在string要"翻身闹革命"了, ...
最新文章
- java对比python的优势_Java相比Python3有哪些优势?
- 电气论文实现:深度学习分位数回归实现电力负荷区间预测
- 创建线程的方式_创建线程有几种不同的方式?
- 【转】mysql锁表解决方法
- Python+Visual Studio
- VUE基础(躺着都能会)
- W3school中js学习
- SQL Server 2005系列教学(12) 导入导出服务
- 24c存储器读写软件_必知必会-存储器层次结构
- “微信之父”张小龙:微信背后的产品观
- 置换检验 配对秩和检验
- Java 嵌入数据处理引擎:SQLite 的挑战者
- java基础-对15位或18位身份证号码的验证
- 2017年计算机二级有什么好处,2017年计算机二级考试备考的五大法宝
- VUE大屏可视化实战
- SqlServer 数据库修复
- jupyter能debug了,使用vscode的jupyter插件进行debug
- 干货来了,这些物联网基础知识你了解吗
- 商城后台管理系统学习日志-01
- 【Java】有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?