艾伟_转载:扩展方法 之 基本数据篇

  前一篇我列举了几个最常用到的基于Asp.Net的扩展方法,而这一篇基于基本数据的扩展方法理应不会逊一筹,因为它不局限于Asp.Net。何谓基本数据,这里直接摆定义:

  C# 中有两种基本数据类型:值类型和引用类型。 值类型包括:简单类型、结构类型、枚举类型;引用类型包括:Object 类型、类类型、接口、代表元、字符串类型、数组。

  说白了这篇就是扩展 int, string, double, DateTime...等基本类型。这么多数据类型,如果int来个扩展,double也来个扩展,肯定会是一个造金字塔工程。幸好有泛型帮我们,但是有时泛型也不是万能的,这个以后有机会再说。

  为什么我们需要扩展方法?一句话:提高写代码的速度,语义也清晰。按道理说,基于基本数据的扩展方法应该经常被用到才有意义,否则只会“污染”被扩展的元素。而怎么才算常用,这可没什么标准,也不是我一个人说了算。所以,以下的扩展方法大家就根据自己的经验判断是否常用吧,至少我的项目是用了不少。

1. In 判断一个元素是否在一个集合里面

(这是我目前为止见到最好的扩展方法之一)

1.1 ScottGu 最初的版本:

  

1.2 后经 鹤冲天 的润色:c#扩展方法奇思妙用高级篇一:改进 Scottgu 的 "In" 扩展

//ScottGu In扩展 改进publicstaticboolIn(thisT t,paramsT[] c)        {returnc.Any(i=>i.Equals(t));        }

1.3 最后我也来凑个热闹:

   public static bool In(this T t, params T[] c)        {return c.Contains(t);//return c.Any(i => i.Equals(t));        }

示例:

bool exist1=  2.In(1, 2, 3);string[] helloworld = { "Hello", "World", "!" };bool exist2 = "Hello".In(helloworld );

2. InRange 判断一个元素是否在某个范围

public static bool InRange(this IComparable t, T minT, T maxT)        {return t.CompareTo(minT) >= 0 && t.CompareTo(maxT) <= 0;        }public static bool InRange(this IComparable t, object minT, object maxT)        {return t.CompareTo(minT) >= 0 && t.CompareTo(maxT) <= 0;        }

示例:

//判断3是否在2~3的范围bool result1 = 3.InRange(2, 3);//判断3.14是否在3.13~3.15的范围bool result2 = 3.14.InRange(3.13, 3.15);//判断今天是否在2000年1月1日~2010年1月1日的范围bool result3 = DateTime.Now.InRange(new DateTime(2000, 1, 1), new DateTime(2010, 1, 1));//判断牛B是否在牛A和牛C之间bool result4 = "牛B".InRange("牛A", "牛C");

上面最后一个示例来源于这句网语:做一个徘徊于牛A和牛C之间的人

3. ForEach 遍历集合

public static void ForEach(this IEnumerable source, Action action){foreach (T element in source)           action(element);}         public static void ForEach(this IEnumerable source, Actionint> action){int i = 0;foreach (T element in source)            action(element, i++); }

注:这两个并非原创,但实在太通用,已经找不到出处。

示例1:Linq to SQL 批量更新

//Linq to SQL IQueryable query = ...;query.ForEach(c => c.Name = "Bruce");db.SubmitChanges();

示例2:设置行号

List list = ...;list.ForEach((c,i) => c.Line = (i+1)); 

4. Clone 克隆一个对象

public static T Clone(this T t) {return (T)CloneObject(t);}private static object CloneObject(object obj) {using (MemoryStream memStream = new MemoryStream())        {                BinaryFormatter binaryFormatter = new BinaryFormatter(null,                   new StreamingContext(StreamingContextStates.Clone));                binaryFormatter.Serialize(memStream, obj);                memStream.Seek(0, SeekOrigin.Begin);return binaryFormatter.Deserialize(memStream);        } }

示例1:克隆单个实体

Entity entity = new Entity { Name = "Bruce", Line = 1 };            Entity cloneEntity = entity.Clone();bool same = entity.Equals(cloneEntity);// 被克隆的类必须标记为可序列化             [Serializable]class Entity           {public string Name { get; set; }public int Line { get; set; }            }

最后entity.Equals(cloneEntity);的结果是false,表明已经成功克隆了一个新对象。

示例2:克隆集合

List list = new List();            list.Add(new Entity { Name = "Bruce", Line = 1 });            list.Add(new Entity { Name = "Jack", Line = 2 });            list.Add(new Entity { Name = "Rose", Line = 3 });            list.Add(new Entity { Name = "Tony", Line = 4 });            List cloneList = list.Clone();

总结:

扩展方法为我们封装了常用的逻辑,与以往静态方法不同的是,从使用者的角度来看已经不用关心这个方法是来自于那个类,主要记着命名空间就可以。所以,一般做法是,所有扩展方法属于同一命名空间,并按被扩展的类型分类,如下图:

最后要说的是,其实string类型的扩展方法应该是使用频率最高的,但基于string的扩展方法网上随便一抓一大把,这里就不重复列举了。

时间: 2024-09-23 07:39:20

艾伟_转载:扩展方法 之 基本数据篇的相关文章

扩展方法 之 基本数据篇

前一篇我列举了几个最常用到的基于Asp.Net的扩展方法,而这一篇基于基本数据的扩展方法理应不会逊一筹,因为它不局限于Asp.Net.何谓基本数据,这里直接摆定义: C# 中有两种基本数据类型:值类型和引用类型. 值类型包括:简单类型.结构类型.枚举类型:引用类型包括:Object 类型.类类型.接口.代表元.字符串类型.数组. 说白了这篇就是扩展 int, string, double, DateTime...等基本类型.这么多数据类型,如果int来个扩展,double也来个扩展,肯定会是一个

艾伟_转载:扩展方法 之 Redirect 篇

前言: 单看标题,可能很多朋友不知道我到底想写什么.在写这篇文章前,我自己跟自己斗争了很久,到底该不该写这篇文章?毕竟从现实主义来看,这篇文章可能落入"瞎扯淡"的行列,因为对大多数朋友来说,以下的所有扩展方法可能都不会用到. 如果真是这样,就当作一个"漫无边际"的想法来看好了.如果你根本不想浪费你的宝贵时间,就点这里 Redirect 回博客园主页,呵呵 一个 Redirect 为什么也可以耗费一篇文章的笔墨? 就 Redirect 一词成文的先例估计不会是我,但如

艾伟_转载:自用扩展方法分享

引言 自从用上扩展方法以来,就欲罢不能了,它们大大提升了我的代码编写效率,现在我已对其产生了高度依赖.在此分享一下自己的常用扩展方法集,方便大家使用. (其中有些是借鉴或挪用自其它博友的文章,在此尤其感谢鹤冲天的诸多分享) 源代码在文章末尾处提供. 示例 public static string ExpandAndToString(this System.Collections.IEnumerable s, string 间隔字符) 功能:将集合展开并分别执行ToString方法,再以指定的分隔

艾伟_转载:老赵谈IL(3):IL可以看到的东西,其实大都也可以用C#来发现

在上一篇文章中,我们通过一些示例谈论了IL与CLR中的一些特性.IL与C#等高级语言的作用类似,主要用于表示程序的逻辑.由于它同样了解太多CLR中的高级特性,因此它在大部分情况下依旧无法展现出比那些高级语言更多的CLR细节.因此,如果您想要通过学习IL来了解CLR,那么这个过程很可能会"事倍功半".因此,从这个角度来说,老赵并不倾向于学习IL.不过严格说来,即使IL无法看出CLR的细节,也不足以说明"IL无用"--这里说"无用"自然有些夸张.但是

艾伟_转载:打造优雅的Linq To SQL动态查询

首先我们来看看日常比较典型的一种查询Form 这个场景很简单:就是根据客户名.订单日期.负责人来作筛选条件,然后找出符合要求的订单. 在那遥远的时代,可能避免不了要写这样的简单接口: public interface IOrderService{ IList<Order> Search(string customer, DateTime dateFrom, DateTime dateTo, int employeeID);} 具体爱怎么实现就怎么实现啦,存储过程,ORM框架.这里假定是用了孩童

艾伟_转载:[一步一步MVC]第五回:让TagBuilder丰富你的HtmlHelper

本系列文章导航 [一步一步MVC]第一回:使用ActionSelector控制Action的选择 [一步一步MVC]第二回:还是ActionFilter,实现对业务逻辑的统一Authorize处理 [一步一步MVC]第三回:MVC范例大观园 [一步一步MVC]第四回:漫谈ActionLink,有时"胡搅蛮缠" [一步一步MVC]第五回:让TagBuilder丰富你的HtmlHelper [一步一步MVC]第六回:什么是MVC(上)? 对HtmlHelper进行扩展,是MVC中对于Vie

扩展方法 之 Redirect 篇

前言: 单看标题,可能很多朋友不知道我到底想写什么.在写这篇文章前,我自己跟自己斗争了很久,到底该不该写这篇文章?毕竟从现实主义来看,这篇文章可能落入"瞎扯淡"的行列,因为对大多数朋友来说,以下的所有扩展方法可能都不会用到. 如果真是这样,就当作一个"漫无边际"的想法来看好了.如果你根本不想浪费你的宝贵时间,就点这里 Redirect 回博客园主页,呵呵 一个 Redirect 为什么也可以耗费一篇文章的笔墨? 就 Redirect 一词成文的先例估计不会是我,但如

艾伟_转载:数据库设计与Linq增强使用

最近对数据库的设计有些想法,貌似一般数据都有些通用字段     public interface IData     {         ///          /// 数据ID标识         ///         decimal ID { get; set; }         ///          /// 更新时间         ///         DateTime UpdateTime { get; set; }         ///          /// 数据状

艾伟_转载:[一步一步MVC]第四回:漫谈ActionLink,有时“胡搅蛮缠”

本系列文章导航 [一步一步MVC]第一回:使用ActionSelector控制Action的选择 [一步一步MVC]第二回:还是ActionFilter,实现对业务逻辑的统一Authorize处理 [一步一步MVC]第三回:MVC范例大观园 [一步一步MVC]第四回:漫谈ActionLink,有时"胡搅蛮缠" [一步一步MVC]第五回:让TagBuilder丰富你的HtmlHelper [一步一步MVC]第六回:什么是MVC(上)? MVC时代来临了,但是一开始是不被很多人接受的.可能