none
List<T>のソートについて RRS feed

  • 質問

  • お世話になります。mkmarimoです。

     

    基本的なことかもしれませんがご教授お願いします。

     

    List<XXX>に以下のような独自定義のクラスのオブジェクトを複数追加します。

     

    calss XXXXX

    {

          string aaa;

          string bbb;

          bool ccc;

          bool ddd;

    }

     

    Listが完成したあと、List内の要素をXXXXXクラスのaaa変数に格納されている文字列で

    ソートしたいんですが、どのようにすればよいでしょうか。

     

    List<T>.Sort()を実行したところ、InvalidOperationException(innerExceptionがArgumentException)が

    スローされました。

    ArgumentExceptionのメッセージは「少なくとも1つのオブジェクトでIComparableを実装しなければなりません。」と

    なっていました。

     

     

    2008年10月7日 7:38

回答

  • mkmarimoさん
    こちらのコードでどうでしょうか?


    //配列作成
    string[] str = new string[] { "a", "0", "b", "1", "あ" };

    List< string > list = new  List< string >();

    //Listに追加 List<string> を作成
    foreach(string  value in str)
    {
    list.add(value);
    }

    Comparison<string> comp = new Comparison<string>(delegate(string val1, string val2)
    {
                                            return val1.CompareTo(val2);
    }
    );

    //ソート実行
    list.Sort(comp);



    mkmarimoさんのサンプルコードで実装しますと

    List<xxxx> list = new List<xxxx>();

    Comparison<xxxx> comp = new Comparison<xxxx>(delegate(xxxx classA , xxxx classB)
    {
    return classA.aaa.CompareTo(classB.aaa);
    }
    );

    list.sort(comp);


    Linqの場合はコード記述が更に楽です。

    List<xxxx> list = new List<xxxx>();
    list = list.OrderBy(o => o.aaa).toList();


    説明が乱雑かと思いますが、
    実際にコードを実行し、デバックで確認してもらえれば。





    2008年10月9日 0:47

すべての返信

  • 基本的には、IComparableインタフェースを継承したクラスでCompareToメソッドを実装します。このクラスをを引数として渡す必要があります。詳細はIComparableインタフェースを調べてみてください。

    .NET Framework 3.5ベースなら、Linqを使ってSortするほうが簡単でしょう。
    2008年10月7日 8:04
  • あとは Comparison<T> を使って比較かな。
    詳しくは List<T>.Sort の解説や使用例に。
    2008年10月7日 8:23
  • mkmarimoさん
    こちらのコードでどうでしょうか?


    //配列作成
    string[] str = new string[] { "a", "0", "b", "1", "あ" };

    List< string > list = new  List< string >();

    //Listに追加 List<string> を作成
    foreach(string  value in str)
    {
    list.add(value);
    }

    Comparison<string> comp = new Comparison<string>(delegate(string val1, string val2)
    {
                                            return val1.CompareTo(val2);
    }
    );

    //ソート実行
    list.Sort(comp);



    mkmarimoさんのサンプルコードで実装しますと

    List<xxxx> list = new List<xxxx>();

    Comparison<xxxx> comp = new Comparison<xxxx>(delegate(xxxx classA , xxxx classB)
    {
    return classA.aaa.CompareTo(classB.aaa);
    }
    );

    list.sort(comp);


    Linqの場合はコード記述が更に楽です。

    List<xxxx> list = new List<xxxx>();
    list = list.OrderBy(o => o.aaa).toList();


    説明が乱雑かと思いますが、
    実際にコードを実行し、デバックで確認してもらえれば。





    2008年10月9日 0:47
  • http://ou812.web.fc2.com/CsTips/SortObject.html

     

    こちらにもサンプルがあります。

    2008年10月9日 1:32
  • ご回答くださった皆様

     

    お世話になります。mkmarimoです。

     

    基本的な質問に対し、丁寧にご回答いただき、ありがとうございます。

     

    実際には別の手段が見つかったため、教えていただいた方法を試す機会が

    なかったのですが、勉強になりました。

     

    ありがとうございました。

    2008年10月9日 9:09