2013-03-20T15:53:38の更新内容

programming/netfx/comparison/0_comparison/index.wiki.txt

current previous
1697,7 1697,7
 
4, 3, 2, 1, 0, 
4, 3, 2, 1, 0, 
 
}}
}}
 

        

        
~
*Comparison<T> [#Comparison]
*Comparision<T> [#Comparision]
 
&msdn(netfx,type,System.Comparison`1){Comparison<T>デリゲート};(System名前空間)は、二つのオブジェクトを比較するメソッド、つまりIComparer<T>.Compareメソッドのような比較処理を行うメソッドを表すデリゲートです。 Array.SortおよびList<T>.Sortメソッドはこのデリゲートを引数に取ることができ、ソートの際の比較処理に使用することが出来ます。
&msdn(netfx,type,System.Comparison`1){Comparison<T>デリゲート};(System名前空間)は、二つのオブジェクトを比較するメソッド、つまりIComparer<T>.Compareメソッドのような比較処理を行うメソッドを表すデリゲートです。 Array.SortおよびList<T>.Sortメソッドはこのデリゲートを引数に取ることができ、ソートの際の比較処理に使用することが出来ます。
 

        

        
 
このデリゲートを用いる利点は、IComparer<T>やIComparable<T>を実装したクラスを用意しなくても、比較処理を定義したメソッドを用意するだけでソートが行える点にあります。 このデリゲートと匿名メソッドやラムダ式を組み合わせて用いることでより簡単に比較処理を記述することも出来ます。
このデリゲートを用いる利点は、IComparer<T>やIComparable<T>を実装したクラスを用意しなくても、比較処理を定義したメソッドを用意するだけでソートが行える点にあります。 このデリゲートと匿名メソッドやラムダ式を組み合わせて用いることでより簡単に比較処理を記述することも出来ます。
1919,92 1919,6
 

        

        
 
なお、Comparer<T>クラスで実装されているIComparer.Compareの比較処理では、null(Nothing)はnull以外のどのような値よりも小さいとみなされます。 この動作を変えたい場合は、派生クラスでIComparer.Compareを再実装する必要があります。
なお、Comparer<T>クラスで実装されているIComparer.Compareの比較処理では、null(Nothing)はnull以外のどのような値よりも小さいとみなされます。 この動作を変えたい場合は、派生クラスでIComparer.Compareを再実装する必要があります。
 

        

        
+
**Comparer.Create [#Comparer.Create]
+
.NET Framework 4.5からは、任意の[[Comparison<T>デリゲート>#Comparison]]からComparer<T>クラスのインスタンスを作成するメソッド&msdn(netfx,member,System.Collections.Generic.Comparer`1.Create){Comparer<T>.Create};が追加されました。 このメソッドを使うことにより、Comparer<T>を継承したクラスを作成しなくても、Comparison<T>デリゲートをIComparer<T>として使用することができるようになります。
+

          
+
このメソッドは、IComparer<T>インターフェイスはサポートしているがComparison<T>デリゲートはサポートしていないクラスやメソッドを使用する際に特に便利です。 例えば[[SortedList>programming/netfx/collections/2_generic_3_sortedlist_sorteddictionary]]では、[[コンストラクタにIComparer<T>を指定することで要素のソート順を変更する>programming/netfx/collections/2_generic_3_sortedlist_sorteddictionary#SortedListSortedDictionary_SpecifyComparer]]ことができますが、Comparison<T>デリゲートを直接指定することはできません。 そのため、既存の比較用メソッドをSortedListで使用しようとした場合、メソッドをComparer<T>を継承(もしくはIComparer<T>を実装)したクラスに書き換える必要がありますが、Comparer<T>.Createメソッドを使えばコードを一切変更することなくそのまま活用することができます。
+

          
+
次の例では、int型の値を降順で比較するメソッドからComparer<int>を作成し、SortedListの並び替え順として使用するようにしています。 これにより、SortedListの内容はキーを降順にした並べ替えられます。
+

          
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Collections.Generic;
+

          
+
class Sample
+
{
+
  // int型の値を降順で比較するメソッド
+
  static int CompareDescendingOrder(int x, int y)
+
  {
+
    return y - x;
+
  }
+

          
+
  static void Main()
+
  {
+
    // メソッドからComparer<int>を作成
+
    Comparer<int> comparer = Comparer<int>.Create(CompareDescendingOrder);
+

          
+
    // 作成したComparer<int>を指定してSortedListを作成
+
    SortedList<int, string> idAndName = new SortedList<int, string>(comparer);
+

          
+
    idAndName.Add(1, "Eve");
+
    idAndName.Add(4, "Dave");
+
    idAndName.Add(2, "Alice");
+
    idAndName.Add(0, "Charlie");
+
    idAndName.Add(3, "Bob");
+

          
+
    // SortedListの内容を表示
+
    foreach (KeyValuePair<int, string> pair in idAndName)
+
    {
+
      Console.WriteLine("{0}:{1}", pair.Key, pair.Value);
+
    }
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Collections.Generic
+

          
+
Class Sample
+
  ' Integer型の値を降順で比較するメソッド
+
  Shared Function CompareDescendingOrder(ByVal x As Integer, ByVal y As Integer) As Integer
+
    Return y - x
+
  End Function
+

          
+
  Shared Sub Main()
+
    ' メソッドからComparer(Of Integer)を作成
+
    Dim comparer As Comparer(Of Integer) = Comparer(Of Integer).Create(AddressOf CompareDescendingOrder)
+

          
+
    ' 作成したComparer(Of Integer)を指定してSortedListを作成
+
    Dim idAndName As New SortedList(Of Integer, String)(comparer)
+

          
+
    idAndName.Add(1, "Eve")
+
    idAndName.Add(4, "Dave")
+
    idAndName.Add(2, "Alice")
+
    idAndName.Add(0, "Charlie")
+
    idAndName.Add(3, "Bob")
+

          
+
    ' SortedListの内容を表示
+
    For Each pair As KeyValuePair(Of Integer, String) In idAndName
+
      Console.WriteLine("{0}:{1}", pair.Key, pair.Value)
+
    Next
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt{{
+
4:Dave
+
3:Bob
+
2:Alice
+
1:Eve
+
0:Charlie
+
}}
+

          
+

          
+

          
 
*StringComparer [#StringComparer]
*StringComparer [#StringComparer]
 
&msdn(netfx,type,System.StringComparer){StringComparerクラス};(System名前空間)は、文字列比較に特化したIComparerの実装です。 大文字小文字を無視した比較、現在のカルチャ・インバリアントカルチャの規則に基づいた比較などを行う実装が用意されています。 詳細については、[[StringComparerについての個別の解説>programming/netfx/string/2_2_compareoptions#StringComparisonStringComparer]]を参照してください。
&msdn(netfx,type,System.StringComparer){StringComparerクラス};(System名前空間)は、文字列比較に特化したIComparerの実装です。 大文字小文字を無視した比較、現在のカルチャ・インバリアントカルチャの規則に基づいた比較などを行う実装が用意されています。 詳細については、[[StringComparerについての個別の解説>programming/netfx/string/2_2_compareoptions#StringComparisonStringComparer]]を参照してください。