引言
自从用上扩展方法以来,就欲罢不能了,它们大大提升了我的代码编写效率,现在我已对其产生了高度依赖。在此分享一下自己的常用扩展方法集,方便大家使用。
(其中有些是借鉴或挪用自其它博友的文章,在此尤其感谢鹤冲天的诸多分享)
源代码在文章末尾处提供。
示例
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<string,string> 表达式)
功能:验证字符串对象是否为空对象或空字符串,如果是的话,则执行传入表达式,并将表达式结果返回。
范例:
[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<string> 表达式)
功能:验证字符串对象是否为空对象或空字符串,如果是的话,则执行传入表达式。
范例:
[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<T>(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<T, C>(this T t, System.Func<T,C,bool> 判断表达式, 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<T>(this System.IComparable<T> 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<T>(this T t)
public static T Trace<T>(this T t, string 分类)
public static T Trace<T>(this T t, System.Func<T,object> 表达式)
public static T Trace<T>(this T t, System.Func<T,object> 表达式, 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<T>(this T t, string 格式化字符串)
public static T TraceFormat<T>(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<T>(this System.Collections.Generic.IEnumerable<T> source, System.Action<T> 操作)
public static void ForEach<T>(this System.Collections.Generic.IEnumerable<T> source, System.Action<T,int> 操作)
功能:遍历一个集合,执行指定操作。(重载形式中,传入表达式的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<T> Switch<T>(this T v)
public static Case<T,R> Switch<T, R>(this T v, System.Func<R,R,R> 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<T> RecursionSelect<T>(this T o, System.Func<T,IEnumerable<T>> 递归项选取表达式)
public static System.Collections.Generic.IEnumerable<T> RecursionSelect<T>(this T o, System.Func<T,IEnumerable<T>> 递归项选取表达式, System.Predicate<T> 检验表达式)
功能:递归选取项目,并将最终选定的集合返回。
相关原理说明参看:《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<T> RecursionEachSelect<T>(this System.Collections.IEnumerable o, System.Func<T,IEnumerable<T>> 递归项选取表达式)
public static System.Collections.Generic.IEnumerable<T> RecursionEachSelect<T>(this System.Collections.IEnumerable o, System.Func<T,IEnumerable<T>> 递归项选取表达式, System.Predicate<T> 检验表达式)
public static System.Collections.Generic.IEnumerable<T> RecursionEachSelect<T>(this System.Collections.Generic.IEnumerable<T> o, System.Func<T,IEnumerable<T>> 递归项选取表达式)
public static System.Collections.Generic.IEnumerable<T> RecursionEachSelect<T>(this System.Collections.Generic.IEnumerable<T> o, System.Func<T,IEnumerable<T>> 递归项选取表达式, System.Predicate<T> 检验表达式)
功能:遍历当前集合对象,逐一递归选取项目,并将最终选定的集合返回。
相关原理说明参看:《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<T>(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