分享
 
 
 

自用扩展方法分享

王朝学院·作者佚名  2010-01-16
窄屏简体版  字體: |||超大  

引言

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

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

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

示例

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有