33459
.NETまったく初心者の質問です．

Javaの世界にはコレーションをつかさどるクラスがあります．例えば

```

    java.text.Collator
    java.text.RuleBasedCollator
    
```

有名どころのICU（International Components for Unicode）では

```

    com.ibm.icu4jni.text.Collator
    com.ibm.icu4jni.text.RuleBasedCollator    
    
```

など．

でも.NETの場合（私が見てみる限り）コレーションを操作できるようなクラスが見つかりませんでした．

  * もし.NETで該当するようなクラスがあるようでしたら教えてください． 
  * ない場合、.NETではコレーションについてはどのように扱っているのでしょうか？教えてください．

以上 初歩的な質問ですがよろしくお願いいたします．
CC BY-SA 3.0
2017-03-22T07:07:09.917
33455
2017-03-22T10:23:33.243
9503
question
java .net
.NETでのコレーション
.NETにおいては、コレーションという狭い範囲でなく

  * 文字列の処理
  * 日付と時刻の処理
  * 数値の処理

を総合して[グローバリゼーション](https://msdn.microsoft.com/ja-
jp/library/c08a467e\(v=vs.110\).aspx)と呼び、[CultureInfoクラス](https://msdn.microsoft.com/ja-
jp/library/system.globalization.cultureinfo\(v=vs.110\).aspx)がこれを表現します。  
ですので、例えば文字列比較[`String.Compare`](https://msdn.microsoft.com/ja-
jp/library/system.string.compare\(v=vs.110\).aspx)であれば`CultureInfo`を引数にとるオーバーロードが用意されています。  
また、.NETではスレッドに対して`CultureInfo`を設定することができます（[`Thread.CurrentUICulture`](https://msdn.microsoft.com/ja-
jp/library/system.threading.thread.currentuiculture\(v=vs.110\).aspx)）。このため、`String.Compare`の他のオーバーロードなど明示的に`CultureInfo`を与えていない処理であっても暗黙的にこの値を使用するものもあります。例えば[`String.Compare(String,
String)`](https://msdn.microsoft.com/en-us/library/84787k22\(v=vs.110\).aspx)は

> The comparison uses **the current culture** to obtain culture-specific
> information such as casing rules and the alphabetic order of individual
> characters.

と説明されています。
CC BY-SA 3.0
2017-03-22T09:02:27.610
33459
2017-03-22T09:02:27.610
4236
33455
answer
.NETでは文字列比較に汎用的な比較子のインターフェイスである`IEqualityComparer<T>`および`IComparer<T>`を使用します。これらはJavaで`Collator`が実装している`Comparator<T>`に相当します。

```

    interface IEqualityComparer<T> {
        int GetHashCode(T obj);
        bool Equals(T x, T y);
    }
    interface IComparer<T> {
        int Compare(T x, T y);
    }
    
```

通常これらのインターフェイスのインスタンスは`StringComparer`クラスの静的メンバーからインスタンスを取得して使用します。

```

    class StringComparer : IEqualityComparer<string>, IComparer<string> {
    
        static StringComparer CurrentCulture { get; }
        static StringComparer CurrentCultureIgnoreCase { get; }
        static StringComparer InvariantCulture { get; }
        static StringComparer InvariantCultureIgnoreCase { get; }
        static StringComparer Ordinal { get; }
        static StringComparer OrdinalIgnoreCase { get; }
    
        static StringComparer Create(CultureInfo culture, bool ignoreCase);
    }
    
```
CC BY-SA 3.0
2017-03-22T10:23:33.243
33460
2017-03-22T10:23:33.243
5750
33455
answer