C# 3.0 から可能になった拡張メソッド (extension method) の仕組みによって、インスタンスメソッドと同じ構文で追加したメソッドが呼び出せるのはとても便利です。
日々のプログラミングの中で、少しでもプログラムの記述量を減らすことができる拡張メソッドを作成しておくと、作業の効率も上がります。
今回はそんな拡張メソッドをいくつか挙げておきます。
「拡張メソッドって何?」という方は以下の記事が参考になります。
目次
文字列の拡張メソッド
文字列の拡張メソッドは StringExtensions クラスを作成し、その中に作成します。
1 2 3 4 5 6 7 |
/// <summary> /// String 拡張メソッドクラス /// </summary> public static class StringExtensions { // このクラスに String の拡張メソッドを作成します... } |
StringExtensions メソッドの一覧
メソッド名 | 説明 |
---|---|
Contains | カルチャに依存した比較、または大文字と小文字を区別しない比較などの序数による比較を指定できる Contains。 |
Contains | 部分一致・前方一致・後方一致するかどうかを判定します。 |
Format | Format の簡易版。 (string.Format(format, arg0) が format.Format(arg0) で呼び出せます。) |
Format | Format の簡易版。 (string.Format(format, args) が format.Format(args) で呼び出せます。) |
IsDate | 文字列が日付かどうかを判定します。 |
IsDateTime | 文字列が日時かどうかを判定します。 |
IsNullOrEmpty | IsNullOrEmpty の簡易版 。(string.IsNullOrEmpty(value) が value.IsNullOrEmpty() で呼び出せます。) |
IsNullOrEmpty | 置換文字列を指定できる形式の IsNullOrEmpty。 |
IsNullOrWhiteSpace | IsNullOrWhiteSpace の簡易版。 (string.IsNullOrWhiteSpace(value) が value.IsNullOrWhiteSpace() で呼び出せます。) |
IsNullOrWhiteSpace | 置換文字列を指定できる形式の IsNullOrWhiteSpace。 |
IsNumeric | 文字列が数値かどうかを判定します。 |
IsTime | 文字列が時刻かどうかを判定します。 |
Left | 文字列の左から指定した桁数の文字列を取得します。 |
LengthB | 文字列のバイト数を取得します。 |
Remove | 文字列から指定した文字列 (複数指定可能) を削除します。 |
Replicate | 文字列を指定回数繰り返した文字列を取得します。 |
Right | 文字列の右から指定した桁数の文字列を取得します。 |
YyyyMmDdToDate | yyyyMMdd 形式の文字列を日付型に変換します。 |
Contains メソッド
1 2 3 4 5 6 7 8 9 10 11 |
/// <summary> /// カルチャに依存した比較、または大文字と小文字を区別しない比較などの序数による比較を指定できる Contains。 /// </summary> /// <param name="value">対象文字列</param> /// <param name="partialValue">部分文字列</param> /// <param name="comparison">カルチャ、大文字と小文字の区別、および並べ替え規則を指定する StringComparison</param> /// <returns>一致する場合に true を返します。</returns> public static bool Contains(this string value, string partialValue, StringComparison comparison) { return value.IndexOf(partialValue, comparison) >= 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
/// <summary> /// 部分一致・前方一致・後方一致するかどうかを判定します。 /// </summary> /// <param name="value">対象文字列</param> /// <param name="partialValue">部分文字列</param> /// <param name="likeStyle">一致スタイル</param> /// <returns>一致する場合に true を返します。</returns> public static bool Contains(this string value, string partialValue, ContainsStyle containsStyle = ContainsStyle.Normal) { bool isMatch = false; switch (containsStyle) { case ContainsStyle.Normal: // 部分一致 isMatch = value.Contains(partialValue); break; case ContainsStyle.Forward: // 前方一致 isMatch = value.StartsWith(partialValue); break; case ContainsStyle.Backward: // 後方一致 isMatch = value.EndsWith(partialValue); break; } return isMatch; } /// <summary> /// Contains の一致スタイル /// </summary> public enum ContainsStyle { /// <summary> /// 部分一致 /// </summary> Normal = 0, /// <summary> /// 前方一致 /// </summary> Forward, /// <summary> /// 後方一致 /// </summary> Backward } |
Format メソッド
1 2 3 4 5 6 7 8 9 10 |
/// <summary> /// Format の簡易版。 (string.Format(format, arg0) が format.Format(arg0) で呼び出せます。) /// </summary> /// <param name="value">複合書式設定文字列</param> /// <param name="arg0">書式指定するオブジェクト</param> /// <returns>書式設定した文字列を返します。</returns> public static string Format(this string value, object arg0) { return string.Format(value, arg0); } |
1 2 3 4 5 6 7 8 9 10 |
/// <summary> /// Format の簡易版。 (string.Format(format, args) が format.Format(args) で呼び出せます。) /// </summary> /// <param name="value">複合書式設定文字列</param> /// <param name="args">0 個以上の書式設定対象オブジェクトを含んだオブジェクト配列</param> /// <returns>書式設定した文字列を返します。</returns> public static string Format(this string value, params object[] args) { return string.Format(value, args); } |
IsDate メソッド
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/// <summary> /// 文字列が日付かどうかを判定します。 /// </summary> /// <param name="value">対象文字列</param> /// <returns>日付の場合に true を返します。</returns> public static bool IsDate(this string value) { if (string.IsNullOrWhiteSpace(value)) { return false; } // 8桁の数字文字列 System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex("[0-9]{8}"); if (regex.IsMatch(value)) { return System.DateTime.TryParseExact(value, "yyyyMMdd", null, System.Globalization.DateTimeStyles.None, out DateTime result); } return DateTime.TryParse(value, out DateTime d); } |
IsDateTime メソッド
1 2 3 4 5 6 7 8 9 |
/// <summary> /// 文字列が日時かどうかを判定します。 /// </summary> /// <param name="value">対象文字列</param> /// <returns>日時の場合に true を返します。</returns> public static bool IsDateTime(this string value) { return DateTime.TryParse(value, out DateTime d); } |
IsNullOrEmpty メソッド
1 2 3 4 5 6 7 8 9 |
/// <summary> /// IsNullOrEmpty の簡易版。 (string.IsNullOrEmpty(value) が value.IsNullOrEmpty() で呼び出せます。) /// </summary> /// <param name="value">対象文字列</param> /// <returns>Null または Empty の場合に true を返します。</returns> public static bool IsNullOrEmpty(this string value) { return string.IsNullOrEmpty(value); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/// <summary> /// 置換文字列を指定できる形式の IsNullOrEmpty。 /// </summary> /// <param name="value">対象文字列</param> /// <param name="replacementValue">Null または Empty の場合に置換する文字列</param> /// <returns>Null または Empty の場合は replacementValue を返します。その他は value を返します。</returns> public static string IsNullOrEmpty(this string value, string replacementValue) { if (string.IsNullOrEmpty(value)) { return replacementValue; } return value; } |
IsNullOrWhiteSpace メソッド
1 2 3 4 5 6 7 8 9 |
/// <summary> /// IsNullOrWhiteSpace の簡易版。 (string.IsNullOrWhiteSpace(value) が value.IsNullOrWhiteSpace() で呼び出せます。) /// </summary> /// <param name="value">対象文字列</param> /// <returns>Null または WhiteSpace の場合に true を返します。</returns> public static bool IsNullOrWhiteSpace(this string value) { return string.IsNullOrWhiteSpace(value); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/// <summary> /// 置換文字列を指定できる形式の IsNullOrWhiteSpace。 /// </summary> /// <param name="value">対象文字列</param> /// <param name="replacementValue">Null または WhiteSpace の場合に置換する文字列</param> /// <returns>Null または WhiteSpace の場合は replacementValue を返します。その他は value を返します。</returns> public static string IsNullOrWhiteSpace(this string value, string replacementValue) { if (string.IsNullOrWhiteSpace(value)) { return replacementValue; } return value; } |
IsNumeric メソッド
1 2 3 4 5 6 7 8 9 |
/// <summary> /// 文字列が数値かどうかを判定します。 /// </summary> /// <param name="value">対象文字列</param> /// <returns>数値の場合に true を返します。</returns> public static bool IsNumeric(this string value) { return decimal.TryParse(value, out decimal d); } |
IsTime メソッド
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
/// <summary> /// 文字列が時刻かどうかを判定します。 /// </summary> /// <param name="value">対象文字列</param> /// <returns>時刻の場合に true を返します。</returns> public static bool IsTime(this string value) { if (string.IsNullOrWhiteSpace(value)) { return false; } // 6桁の数字文字列 System.Text.RegularExpressions.Regex regex6 = new System.Text.RegularExpressions.Regex("[0-9]{6}"); if (regex6.IsMatch(value)) { value = $"{value.Substring(0, 2)}:{value.Substring(2, 2)}:{value.Substring(4, 2)}"; } else { // 4桁の数字文字列 System.Text.RegularExpressions.Regex regex4 = new System.Text.RegularExpressions.Regex("[0-9]{4}"); if (regex4.IsMatch(value)) { value = $"{value.Substring(0, 2)}:{value.Substring(2, 2)}"; } } string datetime = $"2000/1/1 {value}"; return DateTime.TryParse(datetime, out DateTime d); } |
Left メソッド
1 2 3 4 5 6 7 8 9 10 |
/// <summary> /// 文字列の左から指定した桁数の文字列を取得します。 /// </summary> /// <param name="value">対象文字列</param> /// <param name="length">桁数</param> /// <returns>左から指定した桁数の文字列を返します。</returns> public static string Left(this string value, int length) { return string.IsNullOrEmpty(value) || value.Length < length ? value : value.Substring(0, length); } |
LengthB メソッド
1 2 3 4 5 6 7 8 9 10 11 |
/// <summary> /// 文字列のバイト数を取得します。 /// </summary> /// <param name="value">対象文字列</param> /// <returns>バイト数を返します。</returns> public static int LengthB(this string value) { Encoding enc = Encoding.GetEncoding("Shift_JIS"); int length = enc.GetByteCount(value); return length; } |
Remove メソッド
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/// <summary> /// 文字列から指定した文字列 (複数指定可能) を削除します。 /// </summary> /// <param name="value">対象文字列</param> /// <param name="removeValues">削除する文字列の配列</param> /// <returns>削除した結果の文字列を返します。</returns> public static string Remove(this string value, params string[] removeValues) { string resultValue = value; foreach (string removeValue in removeValues) { resultValue = resultValue.Replace(removeValue, string.Empty); } return resultValue; } |
Replicate メソッド
1 2 3 4 5 6 7 8 9 10 |
/// <summary> /// 文字列を指定回数繰り返した文字列を取得します。 /// </summary> /// <param name="value">対象文字列</param> /// <param name="repeatCount">繰り返す回数</param> /// <returns>指定した回数繰り返した文字列を返します。</returns> public static string Replicate(this string value, int repeatCount) { return string.Concat(Enumerable.Repeat(value, repeatCount)); } |
Right メソッド
1 2 3 4 5 6 7 8 9 10 |
/// <summary> /// 文字列の右から指定した桁数の文字列を取得します。 /// </summary> /// <param name="value">対象文字列</param> /// <param name="length">桁数</param> /// <returns>右から指定した桁数の文字列を返します。</returns> public static string Right(this string value, int length) { return string.IsNullOrEmpty(value) ? value : value.Substring(value.Length - length); } |
YyyyMmDdToDate メソッド
1 2 3 4 5 6 7 |
/// <summary> /// yyyyMMdd 形式の文字列を日付型に変換します。 /// </summary> public static DateTime YyyyMmDdToDate(this string value) { return DateTime.ParseExact(value, "yyyyMMdd", null); } |
その他の文字列の拡張メソッドについては以下を参照してください。
日時の拡張メソッド
日時の拡張メソッドは DateTimeExtensions クラスを作成し、その中に作成します。
1 2 3 4 5 6 7 |
/// <summary> /// DateTime 拡張メソッドクラス /// </summary> public static class DateTimeExtensions { // このクラスに DateTime の拡張メソッドを作成します... } |
DateTimeExtensions メソッドの一覧
メソッド名 | 説明 |
---|---|
Age | 生年月日に対する現在の年齢を取得します。 |
EndOfMonth | 日付を含む月の最後の日 (末日) を返します。 |
Age メソッド
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/// <summary> /// 生年月日に対する現在の年齢を取得します。 /// </summary> /// <param name="dateOfBirth">生年月日</param> /// <returns>年齢を返します。</returns> public static int Age(this DateTime dateOfBirth) { DateTime today = DateTime.Today; if (today.Month < dateOfBirth.Month || today.Month == dateOfBirth.Month && today.Day < dateOfBirth.Day) { return today.Year - dateOfBirth.Year - 1; } else { return today.Year - dateOfBirth.Year; } } |
EndOfMonth メソッド
1 2 3 4 5 6 7 8 9 |
/// <summary> /// 日付を含む月の最後の日 (末日) を返します。 /// </summary> /// <param name="this">対象日付</param> /// <returns>日付の属する月の最終日を返します。</returns> public static DateTime EndOfMonth(this DateTime date) { return new DateTime(date.Year, date.Month, 1).AddMonths(1).AddDays(-1); } |
その他の文字列の拡張メソッドについては以下を参照してください。
10 進数の拡張メソッド
10 進数の拡張メソッドは DecimalExtensions クラスを作成し、その中に作成します。
1 2 3 4 5 6 7 |
/// <summary> /// Decimal 拡張メソッドクラス /// </summary> public static class DecimalExtensions { // このクラスに Decimal の拡張メソッドを作成します... } |
DecimalExtensions メソッドの一覧
メソッド名 | 説明 |
---|---|
Ceiling | 小数以下を切り上げた最小の整数を取得します。 |
Floor | 小数以下を切り捨てた最大の整数を取得します。 |
Round | 小数以下を最も近い整数に丸めます。 |
Ceiling メソッド
1 2 3 4 5 6 7 8 9 |
/// <summary> /// 小数以下を切り上げた最小の整数を取得します。 /// </summary> /// <param name="this">対象の値</param> /// <returns>切り上げた最小の整数を返します。</returns> public static decimal Ceiling(this decimal @this) { return Math.Ceiling(@this); } |
Floor メソッド
1 2 3 4 5 6 7 8 9 |
/// <summary> /// 小数以下を切り捨てた最大の整数を取得します。 /// </summary> /// <param name="this">対象の値</param> /// <returns>切り捨てた最大の整数を返します。を返します。</returns> public static decimal Floor(this decimal @this) { return Math.Floor(@this); } |
Round メソッド
1 2 3 4 5 6 7 8 9 |
/// <summary> /// 最も近い整数に丸めます。 /// </summary> /// <param name="this">対象の値</param> /// <returns>丸めた結果の整数を返します。</returns> public static decimal Round(this decimal @this) { return Math.Round(@this); } |
その他の10 進数の拡張メソッドについては以下を参照してください。
倍精度浮動小数点数の拡張メソッド
倍精度浮動小数点数の拡張メソッドは DoubleExtensions クラスを作成し、その中に作成します。
1 2 3 4 5 6 7 |
/// <summary> /// Double 拡張メソッドクラス /// </summary> public static class DoubleExtensions { // このクラスに Double の拡張メソッドを作成します... } |
DoubleExtensions メソッドの一覧
メソッド名 | 説明 |
---|---|
Abs | 絶対値を取得します。 |
Exp | 累乗した値を取得します。 |
Pow | 指定した値で累乗した値を取得します。 |
Abs メソッド
1 2 3 4 5 6 7 8 9 |
/// <summary> /// 数値の絶対値を取得します。 /// </summary> /// <param name="this">対象の値</param> /// <returns>絶対値を返します。</returns> public static double Abs(this double @this) { return Math.Abs(@this); } |
Exp メソッド
1 2 3 4 5 6 7 8 9 |
/// <summary> /// 累乗した値を取得します。 /// </summary> /// <param name="this">対象の値</param> /// <returns></returns> public static double Exp(this double @this) { return Math.Exp(@this); } |
Pow メソッド
1 2 3 4 5 6 7 8 9 10 |
/// <summary> /// 指定した値で累乗した値を取得します。 /// </summary> /// <param name="this">対象の値</param> /// <param name="value">累乗を指定する値</param> /// <returns>累乗した結果の値を返します。</returns> public static double Pow(this double @this, double value) { return Math.Pow(@this, value); } |
その他の倍精度浮動小数点数の拡張メソッドについては以下を参照してください。
ジェネリック (指定した型) の拡張メソッド
ジェネリック (指定した型) の拡張メソッドは GenericExtensions クラスを作成し、その中に作成します。
1 2 3 4 5 6 7 |
/// <summary> /// Generic 拡張メソッドクラス /// </summary> public static class GenericExtensions { // このクラスに Generic の拡張メソッドを作成します... } |
GenericExtensions メソッドの一覧
メソッド名 | 説明 |
---|---|
Between | 値が範囲内にあるかどうかを判定します。 |
IsNull | Null かどうかを検証します。 |
Between メソッド
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/// <summary> /// 値が範囲内にあるかどうかを判定します。 /// </summary> /// <typeparam name="T">対象の型</typeparam> /// <param name="value">対象の値</param> /// <param name="beginValue">開始値</param> /// <param name="endValue">終了値</param> /// <returns>範囲内にある場合に true を返します。</returns> public static bool Between<T>(this T value, T beginValue, T endValue) where T : IComparable { bool isBetween = (value.CompareTo(beginValue) >= 0 && value.CompareTo(endValue) <= 0); return isBetween; } |
IsNull メソッド
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/// <summary> /// Null かどうかを検証します。 /// </summary> /// <typeparam name="T">対象の型</typeparam> /// <param name="value">対象の値またはオブジェクト</param> /// <param name="replacementValue">Null の場合に置換する値</param> /// <returns>Null の場合は replacementValue の値を返します。Null でない場合は value を返します。</returns> public static T IsNull<T>(this T value, T replacementValue) { if (value == null) { return replacementValue; } return value; } |
コレクションの拡張メソッド
コレクションの拡張メソッドは CollectionExtensions クラスを作成し、その中に作成します。
1 2 3 4 5 6 7 |
/// <summary> /// コレクション拡張メソッドクラス /// </summary> public static class CollectionExtensions { // このクラスにコレクションの拡張メソッドを作成します... } |
CollectionExtensions メソッドの一覧
メソッド名 | 説明 |
---|---|
AddIf | 指定した処理条件を満たす場合に項目を追加します。 |
RemoveIf | 指定した処理条件を満たす場合に項目を削除します。 |
AddIf メソッド
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/// <summary> /// 指定した処理条件を満たす場合に項目を追加します。 /// </summary> /// <typeparam name="T">対象の型</typeparam> /// <param name="this">対象のコレクション</param> /// <param name="predicate">処理条件</param> /// <param name="item">追加する項目</param> public static bool AddIf<T>(this ICollection<T> @this, Predicate<T> predicate, T item) { if (predicate(item)) { @this.Add(item); return true; } return false; } |
RemoveIf メソッド
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/// <summary> /// 指定した処理条件を満たす場合に項目を削除します。 /// </summary> /// <typeparam name="T">対象の型</typeparam> /// <param name="this">対象のコレクション</param> /// <param name="predicate">処理条件</param> /// <param name="item">削除する項目</param> public static void RemoveIf<T>(this ICollection<T> @this, Predicate<T> predicate, T item) { if (predicate(item)) { @this.Remove(item); } } |
その他のコレクションの拡張メソッドについては以下を参照してください。
コレクション反復列挙子の拡張メソッド
コレクション反復列挙子の拡張メソッドは EnumerableExtensions クラスを作成し、その中に作成します。
1 2 3 4 5 6 7 |
/// <summary> /// コレクション反復列挙子拡張メソッドクラス /// </summary> public static class EnumerableExtensions { // このクラスにコレクション反復列挙子の拡張メソッドを作成します... } |
EnumerableExtensions メソッドの一覧
メソッド名 | 説明 |
---|---|
ForEach | コレクションに対する反復処理を行います。 |
ToCsv | Csv 形式の文字列に変換します。 |
ForEach メソッド
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/// <summary> /// コレクションに対する反復処理を行います。 /// </summary> /// <typeparam name="T">対象の型</typeparam> /// <param name="enumerable">対象のコレクション</param> /// <param name="action">処理</param> public static void ForEach<T>(this IEnumerable<T> enumerable, Action<T> action) { foreach (T item in enumerable) { action(item); } } |
ToCsv メソッド
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
/// <summary> /// Csv 形式の文字列に変換します。 /// </summary> /// <param name="enumerable">対象の文字列のコレクション</param> /// <param name="separator">区切り文字</param> /// <returns>Csv 形式の文字列を返します。</returns> public static string ToCsv(this IEnumerable<string> enumerable, char separator = ',') { StringBuilder csv; if (enumerable != null) { csv = new StringBuilder(); enumerable.Foreach(v => { string val = v; if (v.Contains("\"") || v.Contains("\n")) { if (v.Contains("\"")) { // ダブルクォートがある場合はダブルクォートを2つに重ねる。(" => "") val = val.Replace("\"", "\"\""); } // ダブルクォートまたは改行がある場合はダブルクォートで囲む。 val = $"\"{val}\""; } csv.AppendFormat("{0}{1}", val, separator); }); return csv.ToString(0, csv.Length - 1); } return null; } |
拡張メソッドの使用例
ここでは、String の拡張メソッドに作成した Replicate メソッドと、Right メソッドを使用した例を記載します。
1 2 3 4 5 |
int maxLength = 6; string value = "1"; string code = ("0".Replicate(maxLength) + value).Right(maxLength); // ↑ // string code = value.PadLeft(maxLength, '0'); と同じことを行っています。 |
拡張メソッドは今後も随時追加していく予定です。