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

引言

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

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

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

示例

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

时间: 2024-10-24 07:20:07

艾伟_转载:自用扩展方法分享的相关文章

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

前一篇我列举了几个最常用到的基于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方法,再以指定的分隔符衔接,拼接 成一个字符串. 范例: [TestMethod] public void Tes

艾伟_转载:数组排序方法的性能比较(上):注意事项及试验

昨天有朋友写了一篇文章,其中比较了List的Sort方法与LINQ中排序方法的性能,而最终得到的结果是"LINQ排序方法性能高于List.Sort方法".这个结果不禁让我很疑惑.因为List.Sort方法是改变容器内部元素的顺序,而LINQ排序后得到的是一个新的序列.假如两个排序方法的算法完全一致,LINQ排序也比对方多出元素复制的开销,为什么性能反而会高?如果LINQ排序的算法/实现更为优秀,那为什么.NET Fx不将List.Sort也一并优化一下呢?于是今天我也对这个问题进行了简

艾伟_转载:虚方法的使用

<编程絮语>之一 C#的语法脱胎于C++,因而保留了virtual关键字,可以定义一个虚方法(或虚属性).一个类的成员被定义为virtual,就意味着它在告诉自己的子类:我准备了一笔遗产,你可以全盘接受,也可以完全拒绝或者修改我的遗嘱.显然,虚方法授予子类的权利甚至大于抽象方法.子类面对抽象方法只有重写(override)的权利,而对于虚方法,它还可以选择完全继承. 毫无疑问,虚方法破坏了对象的封装性.如果不加约束的使用,会对调用方造成破坏,至少它有可能破坏子类与父类之间在外在行为上的一致性.

艾伟_转载:数组排序方法的性能比较(中):Array.Sort&lt;T&gt; 实现分析

昨天我们比较了Array.Sort方法与LINQ排序的性能,知道了LINQ排序的性能以较大幅度落后于Array.Sort方法.而对于Array.Sort来说,性能最高的是其中使用Comparer.Default作为比较器的重载方法.在前文的末尾我们做出了推测:由于排序算法已经近乎一个标准了(快速排序),因此从算法角度来说,Array.Sort方法和LINQ排序上不应该有那么大的差距,因此造成两者性能差异的原因,应该是具体实现方式上的问题. 下载.NET框架的代码 既然是比较实现的区别,那么阅读代

艾伟_转载:老赵谈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框架.这里假定是用了孩童

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

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