読者です 読者をやめる 読者になる 読者になる

がりらぼ

WindowsRuntimeの応援ブログ

C#の主要インターフェース解説:IComparerとIComparer<T>

IComparer

前回のIComparableでも解説しましたが、通常の自作クラスのオブジェクトではオブジェクト同士の比較をすることができません。

自作クラスにIComparableインターフェースを実装していればListのSortメソッドで一列にソートすることが可能になります。

しかし、自作クラスがIComparableインターフェースを実装していなくても、後付けで比較方法を定義することができます。

これがIComparerインターフェースとIComparerインターフェースです。

このIComparerインターフェースを使うと、ListのSortメソッドを実行するときに引数として比較方法を渡す事によって比較可能にすることができます。

実装してみる

たとえば適当な自作クラスを作ります。

public class MyObject
{
    public string hoge;
    public MyObject(string hoge)
    {
        this.hoge = hoge;
    }

    
}

さらに、IComparerインターフェースを実装した比較ルールクラスを作ります。

class MyObjectComparerRule : IComparer<MyObject>
{

    public int Compare(MyObject x, MyObject y)
    {

        if (x.hoge.Length > y.hoge.Length)
        {
            //yのほうが小さい時
            return -1;
        }
        else if (x.hoge.Length < y.hoge.Length)
        {
            //yのほうが大きい時
            return 1;
        }
        else
        {
            //xとyが等しい時
            return 0;
        }
    }
}

これをListのSortメソッドに渡してやることによって、ソートが可能となります。

List<MyObject> collection = new List<MyObject>();
collection.Add(new MyObject("コカコーラ"));
collection.Add(new MyObject("ペプシ"));
collection.Add(new MyObject("おーいお茶"));
collection.Add(new MyObject("爽健美茶"));
collection.Add(new MyObject("伊右衛門"));
collection.Add(new MyObject("綾鷹"));
collection.Add(new MyObject("コカコーラゼロ"));

IComparer<MyObject> comparerRule = new MyObjectComparerRule();
collection.Sort(comparerRule);

foreach (var i in collection)
{
    Console.WriteLine(i.hoge);
}

f:id:garicchi:20140911212306p:plain

もちろんBinarySearchメソッドも実行できます。