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

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

#区切り文字を含むstring文字列を、List<string>形式にする
##改行コードで分割したList形式にする
複数文字列で文字列を分割する場合は、この形式

```csharp: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で文字列を分割(複数文字、文字数でも分割)](https://www.sejuku.net/blog/44242)
参考：下記のsoiさんのコメント(2018/8/29) // 記法をコンパクト化
参考：下記のalbireoさんのコメント(2018/8/31) // 分割文字列をstaticにしてnewを廃止

##カンマで分割したList形式にする
１文字で文字列を分割する場合は、この形式(char)

```csharp: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()`」を削除

```csharp: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つの文字列が等しいかを調べる　大文字小文字、半角全角、ひらがなカタカナの区別をしないで文字列を比較する](https://dobon.net/vb/dotnet/string/stringequals.html)

#List<string>に、大文字小文字を区別しないContains()関数を付ける
List<string>
string[]
Dictionary.Keys (string型のKey)
Dictionary.Values (string型のValue)
など、どれでも使用可能です。

```csharp: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; // 見つからなかった
    }
}
```
参考：[大文字／小文字を区別しないで文字列を比較するには？](http://www.atmarkit.co.jp/fdotnet/dotnettips/624ignorecase/ignorecase.html)
参考：下記のalbireoさんのコメント(2018/8/31) thisの型をIEnumerableに変更

#CollectionにAddRange()を追加する

```csharp: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()を使いたかった...。
参考：なにか参考にした気がするのですが、失念しました。

#リスト内に重複があるかチェックする
参考にしたサイトのかたの見解では、パフォーマンスに問題あるので、ご利用は計画的にとのことです。

```csharp: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#】 コレクションの重複をチェックする](https://beachside.hatenablog.com/entry/2016/06/10/210000)

#コレクションの中から重複している要素を返す
重複している要素が複数あるかも知れないので、List形式で返します。

```csharp: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() を削除してみて作ったのだと思います。