LoginSignup
4
3

More than 5 years have passed since last update.

【C#】拡張メソッド書き溜め

Last updated at Posted at 2018-08-29

この記事について

拡張メソッドの備忘録、兼、共有のための記事です。
この記事は、追記したり、グルーピングしたり、常に編集するつもりです。
2019.1.9 ContainsDuplicate() , GetDuplicateArray() を追記

区切り文字を含むstring文字列を、List形式にする

改行コードで分割したList形式にする

複数文字列で文字列を分割する場合は、この形式

Extensions.cs
static class Extensions
{
    private static string[] stringCRLFSeparator = { "\r\n", "\n\r", "\r", "\n" };
    public static List<string> SplitCRLF(this string listString)
    {
        return listString
            .Split(stringCRLFSeparator , StringSplitOptions.RemoveEmptyEntries)
            .ToList();
    }
}

参考:【C#入門】String.Splitで文字列を分割(複数文字、文字数でも分割)
参考:下記のsoiさんのコメント(2018/8/29) // 記法をコンパクト化
参考:下記のalbireoさんのコメント(2018/8/31) // 分割文字列をstaticにしてnewを廃止

カンマで分割したList形式にする

1文字で文字列を分割する場合は、この形式(char)

Extensions.cs
static class Extensions
{
    private static char[] stringCommaSeparator = { ',' };
    public static List<string> SplitComma(this string listString)
    {
        return listString
            .Split(stringCommaSeparator, StringSplitOptions.RemoveEmptyEntries)
            .ToList();
    }
}

参考:下記のsoiさんのコメント(2018/8/29) // 記法をコンパクト化
参考:下記のalbireoさんのコメント(2018/8/31) // 分割文字列をstaticにしてnewを廃止

※リストとしても配列としても使いたい場合

戻り値の型を「IList<string>」にし、拡張メソッド内でList型に変換していた「ToList()」を削除

Extensions.cs
static class Extentions
{
    private static char[] stringCommaSeparator = { ',' };
    public static IList<string> SplitComma(this string listString)
    {
        return listString
            .Split(stringCommaSeparator, StringSplitOptions.RemoveEmptyEntries);
    }
}

// 使い方
string sampleString = "view,viewmodel,model";
string[] array = sampleString.SplitComma().ToArray();  // 配列にしたい場合は、呼び出し側で .ToArray()を付ける
List<string> list = sampleString.SplitComma().ToList();  // リストにしたい場合、呼び出し側で .ToList()を付ける

参考:下記のalbireoさんのコメント
参考:2つの文字列が等しいかを調べる 大文字小文字、半角全角、ひらがなカタカナの区別をしないで文字列を比較する

Listに、大文字小文字を区別しないContains()関数を付ける

List
string[]
Dictionary.Keys (string型のKey)
Dictionary.Values (string型のValue)
など、どれでも使用可能です。

Extensions.cs
static class Extensions
{
    public static bool ContainsIgnoreCase(this IEnumerable<string> list, string target)
    {
        foreach (string obj in list)
        {
            if (String.Compare(obj, target, true) == 0)
            {
                return true;
            }
        }
        return false; // 見つからなかった
    }
}

参考:大文字/小文字を区別しないで文字列を比較するには?
参考:下記のalbireoさんのコメント(2018/8/31) thisの型をIEnumerableに変更

CollectionにAddRange()を追加する

Extensions.cs
static class Extensions
{
    public static void AddRange<T>(this ICollection<T> collection, ICollection<T> target)
    {
        foreach (var item in target)
        {
            collection.Add(item);
        }
    }
}

ObservableCollectionに、AddRange()を使いたかった...。
参考:なにか参考にした気がするのですが、失念しました。

リスト内に重複があるかチェックする

参考にしたサイトのかたの見解では、パフォーマンスに問題あるので、ご利用は計画的にとのことです。

Extensions.cs
static class Extensions
{
    public static bool ContainsDuplicate(this IEnumerable<string> source)
    {
        return source.GroupBy(i => i).SelectMany(g => g.Skip(1)).Any();
    }
}

参考:【C#】 コレクションの重複をチェックする

コレクションの中から重複している要素を返す

重複している要素が複数あるかも知れないので、List形式で返します。

Extensions.cs
static class Extensions
{
    public static IEnumerable<string> GetDuplicateArray(this IEnumerable<string> source)
    {
        return source.GroupBy(i => i).SelectMany(g => g.Skip(1));
    }
}

参考:たぶん、上のContainsDuplicate()を作った時に、.Any() を削除してみて作ったのだと思います。

4
3
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3