引言

自从用上扩展方法以来,就欲罢不能了,它们大大提升了我的代码编写效率,现在我已对其产生了高度依赖。在此分享一下自己的常用扩展方法集,方便大家使用。

(其中有些是借鉴或挪用自其它博友的文章,在此尤其感谢鹤冲天的诸多分享)

源代码在文章末尾处提供。

示例

public static string ExpandAndToString(this System.Collections.IEnumerable s, string 间隔字符)

功能:将集合展开并分别执行ToString方法,再以指定的分隔符衔接,拼接成一个字符串。

范例:

[TestMethod]public void TestMethod1(){var i = new int[] {1,5,33,14,556 };var Out="1-5-33-14-556";Assert.AreEqual(Out,i.ExpandAndToString("-"));}

public static bool IsNullOrEmpty(this string s)

功能:验证字符串对象是否为空对象或空字符串。

范例:

[TestMethod]
public void TestMethod2()
{string s = null;Assert.AreEqual(true,s.IsNullOrEmpty());s += "123";Assert.AreEqual(false, s.IsNullOrEmpty());
}

public static string IsNullOrEmptyThen(this string s, System.Func 表达式)

功能:验证字符串对象是否为空对象或空字符串,如果是的话,则执行传入表达式,并将表达式结果返回。

范例:

[TestMethod]
public void TestMethod3()
{var s = "";var Out = "1234";Assert.AreEqual(Out, s.IsNullOrEmptyThen(f=>"1234"));
}

public static void IsNullOrEmptyThen(this string s, System.Action 表达式)

功能:验证字符串对象是否为空对象或空字符串,如果是的话,则执行传入表达式。

范例:

[TestMethod]
public void TestMethod4()
{var s = "";s.IsNullOrEmptyThen(f => MessageBox.Show("无内容"));
}

public static string FormatWith(this string s, params object[] 格式化参数)

public static string FormatWith(this string s, object 格式化参数1)

public static string FormatWith(this string s, object 格式化参数1, object 格式化参数2)

public static string FormatWith(this string s, object 格式化参数1, object 格式化参数2, object 格式化参数3)

功能:格式化字符串。

范例:

[TestMethod]
public void TestMethod5()
{var i = 0.35;var x = 200;var Out = "i:35%;x:200;";Assert.AreEqual(Out, "i:{0:0%};x:{1};".FormatWith(i,x));
}

public static bool In(this T t, params T[] 判断依据)

功能:判断当前对象是否位于传入数组中。

范例:

[TestMethod]
public void TestMethod6()
{var i = 95;Assert.IsTrue(i.In(31, 3, 55, 67, 95, 12, 4));
}

public static bool In(this T t, System.Func 判断表达式, params C[] 判断依据)

功能:判断当前对象是否位于传入数组中,判断方式由传入表达式指定。

范例:

[TestMethod]
public void TestMethod7()
{var i = 95;Assert.IsTrue(i.In((c, t) => c.ToString() == t, "31", "3", "55", "67", "95", "12", "4"));
}

public static bool InRange(this System.IComparable t, T 最小值, T 最大值)

public static bool InRange(this System.IComparable t, object 最小值, object 最大值)

功能:判断当前值是否介于指定范围内。

范例:

[TestMethod]
public void TestMethod8()
{var i = 95;Assert.IsTrue(i.InRange(15, 100));Assert.IsTrue(i.InRange(-3000, 300));Assert.IsFalse(i.InRange(-1, 50));var s = "b";Assert.IsTrue(s.InRange("a", "c"));Assert.IsTrue(s.InRange("1", "z"));Assert.IsFalse(s.InRange("e", "h"));
}

public static T Trace(this T t)

public static T Trace(this T t, string 分类)

public static T Trace(this T t, System.Func 表达式)

public static T Trace(this T t, System.Func 表达式, string 分类)

功能:将当前对象的值输出到Visual Studio输出窗口中,并将原始对象返回。此功能仅用于方便调试,可以在方法链中的任意步骤中输出值,而不会对方法链的连续性有任何影响。

范例:

[TestMethod]
public void TestMethod9()
{var s = "abcdefg".Trace(f => f.ToUpper(), "表达式模式").Remove(4).Trace("普通模式");var Out = "abcd";Assert.AreEqual(Out, s);//输出内容如下://表达式模式: ABCDEFG//普通模式: abcd
}

public static T TraceFormat(this T t, string 格式化字符串)

public static T TraceFormat(this T t, string 格式化字符串, string 分类)

功能:将当前对象的值经格式化后输出到VisualStudio输出窗口中,并将原始对象返回。此功能仅用于方便调试,可以在方法链中的任意步骤中输出值,而不会对方法链的连续性有任何影响。

范例:

[TestMethod]
public void TestMethod10()
{var m = Math.Max(0.31, 0.65).TraceFormat("Max Value Is {0}", "格式化模式");var Out = 0.65;Assert.AreEqual(Out, m);//输出内容如下://格式化模式: Max Value Is 0.65
}

public static void ForEach(this System.Collections.Generic.IEnumerable source, System.Action 操作)

public static void ForEach(this System.Collections.Generic.IEnumerable source, System.Action 操作)

功能:遍历一个集合,执行指定操作。(重载形式中,传入表达式的int类型参数代表当前循环次数)

范例:

[TestMethod]
public void TestMethod11()
{var l = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };var c = 0;l.ForEach(f => c += f);var Out = 45;Assert.AreEqual(Out, c);l.ForEach((f, i) => c -= i);Out = 9;Assert.AreEqual(Out, c);
}

public static Switch Switch(this T v)

public static Case Switch(this T v, System.Func Do)

功能:判断当前值,根据不同匹配条件执行相应操作或返回相应的值。(重载形式中,允许通过表达式对每一次的返回值进行叠加处理)
详细使用说明参看:《稍加改进的Switch/Case扩展方法》

范例:

[TestMethod]
public void TestMethod12()
{var i = 15;i.Switch().CaseRun(15, f => MessageBox.Show("等于15"),false).CaseRun(f => f > 0, f => MessageBox.Show("大于0")).CaseRun(f => f < 0, f => MessageBox.Show("小于0")).DefaultRun(f => MessageBox.Show("等于0"));var o = 'c'.Switch().CaseReturn('a', 1).CaseReturn('b', 2).CaseReturn('c', 3).CaseReturn('d', 4).CaseReturn(f => f > 'd', 5).DefaultReturn(0).ReturnValue;Assert.AreEqual(3, o);
}

public static System.Collections.Generic.IEnumerable RecursionSelect(this T o, System.Func> 递归项选取表达式)

public static System.Collections.Generic.IEnumerable RecursionSelect(this T o, System.Func> 递归项选取表达式, System.Predicate 检验表达式)

功能:递归选取项目,并将最终选定的集合返回。
相关原理说明参看:《c#扩展方法奇思妙用高级篇七:“树”通用遍历器》

范例:

[TestMethod]
public void TestMethod13()
{//获取指定目录中所有包含子目录的目录集合var d = new DirectoryInfo(@"C:\Users\Public\Downloads");var c = d.RecursionSelect(f => f.GetDirectories(), f => f.GetDirectories().Length > 0);MessageBox.Show(c.Count().ToString());
}

public static System.Collections.Generic.IEnumerable RecursionEachSelect(this System.Collections.IEnumerable o, System.Func> 递归项选取表达式)

public static System.Collections.Generic.IEnumerable RecursionEachSelect(this System.Collections.IEnumerable o, System.Func> 递归项选取表达式, System.Predicate 检验表达式)

public static System.Collections.Generic.IEnumerable RecursionEachSelect(this System.Collections.Generic.IEnumerable o, System.Func> 递归项选取表达式)

public static System.Collections.Generic.IEnumerable RecursionEachSelect(this System.Collections.Generic.IEnumerable o, System.Func> 递归项选取表达式, System.Predicate 检验表达式)

功能:遍历当前集合对象,逐一递归选取项目,并将最终选定的集合返回。
相关原理说明参看:《c#扩展方法奇思妙用高级篇七:“树”通用遍历器》

范例:

[TestMethod]
public void TestMethod14()
{//获取指定目录中所有包含子目录的目录集合var l = new List<DirectoryInfo>();l.Add(new DirectoryInfo(@"C:\Users\SkyD\Downloads"));l.Add(new DirectoryInfo(@"C:\Users\Public\Downloads"));            var c = l.RecursionEachSelect(f => f.GetDirectories(), f => f.GetDirectories().Length > 0);MessageBox.Show(c.Count().ToString());
}

public static bool RegexIsMatch(this string s, string 表达式, System.Text.RegularExpressions.RegexOptions 选项)

public static bool RegexIsMatch(this string s, string 表达式)

public static System.Text.RegularExpressions.Match RegexMatch(this string s, string 表达式, System.Text.RegularExpressions.RegexOptions 选项)

public static System.Text.RegularExpressions.Match RegexMatch(this string s, string 表达式)

public static System.Text.RegularExpressions.MatchCollection RegexMatches(this string s, string 表达式, System.Text.RegularExpressions.RegexOptions 选项)

public static System.Text.RegularExpressions.MatchCollection RegexMatches(this string s, string 表达式)

public static string RegexReplace(this string s, string 表达式, string 替换值, System.Text.RegularExpressions.RegexOptions 选项)

public static string RegexReplace(this string s, string 表达式, string 替换值)

public static string[] RegexSplit(this string s, string 表达式, System.Text.RegularExpressions.RegexOptions 选项)

public static string[] RegexSplit(this string s, string 表达式)

功能:常用正则表达式功能封装,使用方法与Regex类相同。

public static T As(this string s) where T : new(), 通用扩展.SpecialString

public static 通用扩展.HtmlString AsHtmlString(this string s)

public static 通用扩展.PathString AsPathString(this string s)

public static 通用扩展.ServerPathString AsServerPathString(this string s)

public static 通用扩展.UriString AsUriString(this string s)

public static 通用扩展.XHtmlString AsXHtmlString(this string s)

public static 通用扩展.XmlString AsXmlString(this string s)

功能:定义为特殊类型的字符串,以使用特有的格式化命令做进一步修改。(目前定义后的后续格式化功能比较有限,以后会逐步追加)

范例:

[TestMethod]
public void TestMethod15()
{var s = @"C:\abc\";var Out = @"C:\abc\1.exe";Assert.AreEqual(Out, s.AsPathString().Combine(@"D:\1.exe".AsPathString().FileName));
}

结语

这些都是我这里使用频率最高的扩展,希望对大家也同样有用:)

下载

扩展方法源代码:http://www.uushare.com/user/icesee/file/2435046

范例源代码:http://www.uushare.com/user/icesee/file/2435063

本文的XPS版本:http://www.uushare.com/user/icesee/file/2435098

转载于:https://www.cnblogs.com/waw/archive/2011/08/29/2157007.html

艾伟_转载:自用扩展方法分享相关推荐

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

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

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

    本系列文章导航 [一步一步MVC]第一回:使用ActionSelector控制Action的选择 [一步一步MVC]第二回:还是ActionFilter,实现对业务逻辑的统一Authorize处理 [ ...

  3. 艾伟_转载:.NET设计模式:工厂方法模式(Factory Method)

    概述 在软件系统中,经常面临着"某个对象"的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口.如何应对这种变化?提供一种封装机制来隔离出 ...

  4. 艾伟_转载:探索.Net中的委托

    废话 我本来以为委托很简单,本来只想简简单单的说说委托背后的东西,委托的使用方法.原本只想解释一下那句:委托是面向对象的.类型安全的函数指针.可没想到最后惹出一堆的事情来,越惹越多,罪过,罪过.本文后 ...

  5. 艾伟_转载:C#语言基础常见问题汇总

    概述 1.什么是C#? C#是Microsoft公司设计的一种编程语言.它松散地基于C/C++,并且有很多方面和Java类似. Microsoft是这样描述C#的:"C#是从C和C++派生来 ...

  6. 艾伟_转载:ASP.NET MVC数据验证

    关于ASP.NET MVC的验证,用起来很特别,因为MS的封装,使人理解起来很费解.也可能很多人都在Scott Guthrie等人写的一本<ASP.NET MVC 1.0>书中,见过Ner ...

  7. 艾伟_转载:C# WinForm开发系列 - TextBox

    包含金额/日期输入框,带弹出数字面板的计算输入框,安全密码输入等控件(文章及相关代码搜集自网络,仅供参考学习,版权属于原作者! ). 1.CalculatorBox    CalculatorBox. ...

  8. python测试用例设计方法_功能测试用例设计方法分享

    本文首发于:行者AI 测试用例可以用来衡量一个项目测试质量,因此在平时的测试流程中,编写测试用例就是测试过程中很重要的一步,每一个测试工程师都需要并且非常熟练的编写测试用例,能在编写测试用例中尽可能的 ...

  9. 艾伟_转载:学习 ASP.NET MVC (第五回)理论篇

    本系列文章导航 学习 ASP.NET MVC (第一回)理论篇 学习 ASP.NET MVC (第二回)实战篇 学习 ASP.NET MVC (第三回)实战篇 学习 ASP.NET MVC (第四回) ...

最新文章

  1. 百度Q3财报里的“大生意”
  2. PHP7Grafika,PHP图片处理库Grafika详细教程(3):图像属性处理
  3. 【Python基础】4300 字Python列表使用总结,用心!
  4. bootstrap时间控件
  5. redhat 7 oracle 11,redhat7 搭建oracle 11g RAC 问题与处理
  6. 在VMW里安装Ghost操作系统遇到的问题及解决的办法
  7. 移动端开发项目的一些躺坑笔记
  8. windows 网卡驱动安装
  9. python做数学计算器_python作为计算器 数学用法
  10. 尼古拉特斯拉 名言_尼古拉清洁技术的表面魅力
  11. 【良心推荐】国内适合中小企业、团队的十大协同办公系统
  12. java毕业设计蛋糕店会员系统Mybatis+系统+数据库+调试部署
  13. Android UI
  14. 225页10万字政务大数据能力平台项目建议书
  15. CAD手机看图软件中如何根据已知坐标点绘制线段?
  16. 【踩坑】spconf.sty Latex样式模板的name包含下划线
  17. windows如何取消电脑自动关机命令
  18. 网站建设学习(二)---内网穿透
  19. 释疑の生产订单作业价格重估-CON2
  20. 算法竞赛入门经典:第七章 暴力求解法 7.7解答树

热门文章

  1. 【trajectory optimization】1 intro
  2. 29岁转行程序员,39岁成为总裁,宫崎英高的游戏成名之路!
  3. 从理念到大型实践,揭开腾讯零信任iOA安全方案的“落地密码”
  4. 【正点原子I.MX6U-MINI应用篇】1、编写第一个应用App程序helloworld
  5. 一行代码实现访客人次统计
  6. 高分辨率实时抠像-RobustVideoMatting飞桨复现
  7. ubuntu 拨号上网(PPPOE)
  8. TS3180打印机喷头堵塞以及打印照片颜色偏暗完美解决
  9. php获取当前时间戳和unix,Unix 时间戳与日期
  10. 两个不同牌子的手机便签怎么换机