はじめに 拡張メソッドを使い始めて以来、拡張メソッドの使用をやめられず、コード作成の効率が大幅に向上し、今では拡張メソッドに大きく依存するようになりました。皆さんの便宜のために、私がよく使用する拡張メソッドセットをここで共有したいと思います。
(その一部は他のブロガーの記事から借用または流用したものです。多くの情報を共有してくれた He Chongtian に特に感謝したいと思います)
ソースコードは記事の最後に記載されています。
例
public static string ExpandAndToString(この System.Collections.IEnumerable 、文字列スペーサー文字)
機能: コレクションを展開し、ToString メソッドをそれぞれ実行し、指定された区切り文字で接続して文字列に結合します。
例:
[テスト方法]
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(この文字列 s)
機能: 文字列オブジェクトが空のオブジェクトか空の文字列かを確認します。
例:
[テスト方法]
public void TestMethod2()
{
文字列 s = null;
Assert.AreEqual(true,s.IsNullOrEmpty());
s += "123";
Assert.AreEqual(false, s.IsNullOrEmpty());
}
public static string IsNullOrEmptyThen(この文字列 s, System.Func<string,string> 式)
機能: 文字列オブジェクトが空のオブジェクトか空の文字列かを確認し、空の場合は、受信した式を実行し、式の結果を返します。
例:
[テスト方法]
public void TestMethod3()
{
vars = "";
var 出力 = "1234";
Assert.AreEqual(Out, s.IsNullOrEmptyThen(f=>"1234"));
}
public static void IsNullOrEmptyThen(この文字列 s, System.Action<string> 式)
機能: 文字列オブジェクトが空のオブジェクトか空の文字列かを確認し、空の場合は受信式を実行します。
例:
[テスト方法]
public void TestMethod4()
{
vars = "";
s.IsNullOrEmptyThen(f => MessageBox.Show("コンテンツなし"));
}
public static string FormatWith(この文字列 s, params object[] フォーマットパラメータ)
public static string FormatWith(この文字列 s、オブジェクト形式パラメータ 1)
public static string FormatWith(この文字列 s、オブジェクト形式パラメータ 1、オブジェクト形式パラメータ 2)
public static string FormatWith(この文字列 s、オブジェクト形式パラメータ 1、オブジェクト形式パラメータ 2、オブジェクト形式パラメータ 3)
機能: 文字列の書式設定。
例:
[テスト方法]
public void TestMethod5()
{
変数 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[] 判定基準)
機能: 現在のオブジェクトが受信配列内にあるかどうかを判断します。
例:
[テスト方法]
public void TestMethod6()
{
変数 i = 95;
Assert.IsTrue(i.In(31, 3, 55, 67, 95, 12, 4));
}
public static bool In<T, C>(このT t、System.Func<T,C,bool>判定式、params C[]判定基準)
機能: 現在のオブジェクトが受信配列内にあるかどうかを判断します。判定方法は受信式によって指定されます。
例:
[テスト方法]
public void TestMethod7()
{
変数 i = 95;
Assert.IsTrue(i.In((c, t) => c.ToString() == t, "31", "3", "55", "67", "95", "12", "4 "));
}
public static bool InRange<T>(この System.IComparable<T> t、T 最小値、T 最大値)
public static bool InRange(この System.IComparable t、オブジェクトの最小値、オブジェクトの最大値)
機能: 現在の値が指定された範囲内にあるかどうかを判断します。
例:
[テスト方法]
public void TestMethod8()
{
変数 i = 95;
Assert.IsTrue(i.InRange(15, 100));
Assert.IsTrue(i.InRange(-3000, 300));
Assert.IsFalse(i.InRange(-1, 50));
vars = "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>(この T t、文字列分類)
public static T Trace<T>(この T t, System.Func<T,object> 式)
public static T Trace<T>(この T t、System.Func<T,object> 式、文字列分類)
機能: 現在のオブジェクトの値を Visual Studio 出力ウィンドウに出力し、元のオブジェクトを返します。この関数は、デバッグを容易にするためにのみ使用され、メソッド チェーンの連続性に影響を与えることなく、メソッド チェーンのどのステップでも値を出力できます。
例:
[テスト方法]
public void TestMethod9()
{
var s = "abcdefg".Trace(f => f.ToUpper(), "式モード").Remove(4).Trace("通常モード");
var アウト = "abcd";
Assert.AreEqual(Out, s);
//出力内容は以下の通りです。
//表現パターン:ABCDEFG
//通常モード:abcd
}
public static T TraceFormat<T>(この T t、文字列フォーマット文字列)
public static T TraceFormat<T>(この T t、文字列形式文字列、文字列分類)
機能: フォーマット後に現在のオブジェクトの値を Visual Studio 出力ウィンドウに出力し、元のオブジェクトを返します。この関数は、デバッグを容易にするためにのみ使用され、メソッド チェーンの連続性に影響を与えることなく、メソッド チェーンのどのステップでも値を出力できます。
例:
[テスト方法]
public void TestMethod10()
{
var m = Math.Max(0.31, 0.65).TraceFormat("最大値は {0}", "書式設定モード");
varOut = 0.65;
Assert.AreEqual(Out, m);
//出力内容は以下の通りです。
//フォーマットモード: 最大値は 0.65
}
public static void ForEach<T>(この System.Collections.Generic.IEnumerable<T> ソース、System.Action<T> 操作)
public static void ForEach<T>(この System.Collections.Generic.IEnumerable<T> ソース、System.Action<T,int> 操作)
機能: コレクションを走査し、指定された操作を実行します。 (オーバーロードされた形式では、式に渡される int 型パラメータは現在のループ数を表します)
例:
[テスト方法]
public void TestMethod11()
{
var l = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var c = 0;
l.ForEach(f => c += f);
varOut = 45;
Assert.AreEqual(Out, c);
l.ForEach((f, i) => c -= i);
アウト = 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)
機能: 現在の値を決定し、対応する操作を実行するか、さまざまな一致条件に従って対応する値を返します。 (オーバーロードされた形式では、各戻り値を式を通じて重ね合わせることができます)
詳しい手順は「ちょっと改良したスイッチ・ケースの延長方法」をご参照ください。
例:
[テスト方法]
public void TestMethod12()
{
変数 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 To, System.Func<T,IEnumerable<T>> 再帰的な項目選択式)
public static System.Collections.Generic.IEnumerable<T> RecursionSelect<T>(this To, System.Func<T,IEnumerable<T>> 再帰項目選択式, System.Predicate<T> テスト式)
機能: 項目を再帰的に選択し、最終的に選択されたコレクションを返します。
関連する原則の説明については、「C# 拡張メソッドの素晴らしい使い方の上級パート 7: "ツリー" ユニバーサル トラバーサー」を参照してください。
例:
[テスト方法]
public void TestMethod13()
{
// 指定されたディレクトリ内のサブディレクトリを含むすべてのディレクトリ コレクションを取得します
var d = 新しい 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>(この 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> テスト式 Mode )
public static System.Collections.Generic.IEnumerable<T> RecursionEachSelect<T>(この 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> テスト式)
機能: 現在のコレクション オブジェクトを走査し、項目を 1 つずつ再帰的に選択し、最終的に選択されたコレクションを返します。
関連する原則の説明については、「C# 拡張メソッドの素晴らしい使い方の上級パート 7: "ツリー" ユニバーサル トラバーサー」を参照してください。
例:
[テスト方法]
public void TestMethod14()
{
// 指定されたディレクトリ内のサブディレクトリを含むすべてのディレクトリ コレクションを取得します
var l = 新しい List<ディレクトリ情報>();
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(この文字列 s、文字列式、System.Text. RegularExpressions.RegexOptions オプション)
public static bool RegexIsMatch(この文字列 s, 文字列式)
public static System.Text.RegularExpressions.Match RegexMatch(この文字列 s、文字列式、System.Text. RegularExpressions.RegexOptions オプション)
public static System.Text. RegularExpressions.Match RegexMatch(この文字列 s, 文字列式)
public static System.Text.RegularExpressions.MatchCollection RegexMatches(この文字列 s、文字列式、System.Text. RegularExpressions.RegexOptions オプション)
public static System.Text. RegularExpressions.MatchCollection RegexMatches(この文字列 s, 文字列式)
public static string RegexReplace(この文字列、文字列式、文字列置換値、System.Text. RegularExpressions.RegexOptions オプション)
public static string RegexReplace(この文字列、文字列式、文字列置換値)
public static string[] RegexSplit(この文字列、文字列式、System.Text. RegularExpressions.RegexOptions オプション)
public static string[] RegexSplit(この文字列 s, 文字列式)
機能: 一般的に使用される正規表現関数のカプセル化。使用方法は Regex クラスと同じです。
public static T As<T>(this string s) where T : new()、一般拡張.SpecialString
public static universal extension.HtmlString AsHtmlString(この文字列 s)
public static universal extension.PathString AsPathString(この文字列 s)
public static universal extension.ServerPathString AsServerPathString(この文字列 s)
public static universal extension.UriString AsUriString(この文字列 s)
public static universal extension.XHtmlString AsXHtmlString(この文字列 s)
public static universal extension.XmlString AsXmlString(この文字列 s)
機能: 独自の書式設定コマンドを使用してさらに変更できる特別なタイプの文字列として定義されます。 (現状、定義後の書式設定機能は比較的限定されており、今後徐々に追加される予定です)
例:
[テスト方法]
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