引言自從用上擴展方法以來,就欲罷不能了,它們大大提升了我的程式碼編寫效率,現在我已對其產生了高度依賴。在此分享自己常用的擴充方法集,方便大家使用。
(其中有些是藉鏡或挪用自其它博友的文章,在此尤其感謝鶴沖天的諸多分享)
原始碼在文章末尾處提供。
範例
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:UsersPublicDownloads");
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:UsersSkyDDownloads"));
l.Add(new DirectoryInfo(@"C:UsersPublicDownloads"));
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:abc1.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