2011-02-08 6 views
0

好奇心不満(私はちょうどそれがC#でどのように行われているか知りたい)どのように関数/メソッドにポリシーを提供していますか?私はCでソートする機能を持っている場合たとえば、++私はこのような何かを行うことができます。vがベクトルの 関数/メソッド内のポリシー

std::sort(v.begin(),v.end(), Comparator<char>()); 

は、v.beginはそれとこのベクトルのv.end端と、この好奇心の始まりです

Comparator()は、このベクトルをどのような重要度でソートするかを指定するポリシーです。たとえば、ソートなどは、文字などの大文字小文字を無視して行うことができます
C#で同じことをやりますか?

答えて

3

ソートする場合は、通常Comparison<T>またはIComparer<T>を渡します。これは任意の2つの要素を比較するために使用できます。 (IComparer<T>が効果Comparison<T>デリゲートのインターフェイス形である。)

だから例をソートする:一般に

// Using IComparer<T> 
listOfStrings.Sort(StringComparer.OrdinalIgnoreCase); 

// Handy default comparer... 
listOfInts.Sort(Comparer<int>.Default); 

// Using Comparison<T> in a slightly odd way (sorting dates by day of month) 
listOfDates.Sort((x, y) => x.Day.CompareTo(y.Day)); 

、.NET 3.5と(それデリゲートを作成するために風なる)C#3のようにデリゲートを使用すると、「ポリシー」を決定するために1回の操作だけが必要なときに、簡単に作業を行うことができます。しかし、等価の場合は、複数の操作を使用する必要があるかもしれません。したがって、インターフェイスは有用になります。IEqualityComparer<T>には、たとえばEqualsGetHashCodeの両方のメソッドがあります。

+0

@Jonそう、例を挙げてください。文法とそれがどのように美しく見えるかを見たいだけです。 –

+0

@私たちは何もできません:私は自分の答えを編集しました。 –

+0

@Jonの最初の例では、ユーザーが独自のポリシー(または他のポリシー)で "ポリシー" OrdinalIgnoreCaseを実装して文字列オブジェクトに使用できることを理解していますか?例えば、逆順の辞書順に並べ替える場合は、LexicographicalReversedを定義して、OridinalIgnoreCaseの代わりに使用しますか?そして、コンテナの一部だけをソートするのはどうですか?たとえば2000年の最初のレコードは、データベースの5,000、000? –

関連する問題