web-dev-qa-db-ja.com

多くのフィールドでリスト(C#)を注文しますか?

C#のオブジェクトのリストを、1つのフィールドだけでなく、多くのフィールドで並べたい。たとえば、AとBの2つの属性を持つXというクラスがあり、その順序で次のオブジェクトがあるとします。

object1 => A = "a"、B = "h"
object2 => A = "a"、B = "c"
object3 => A = "b"、B = "x"
object4 => A = "b"、B = "b"

リストを最初にA属性で並べ、それらが等しい場合はB要素で並べたいので、順番は次のようになります。

"交流"
"a" "h"
"b" "b"
"b" "x"

私の知る限り、OrderByメソッドは1つのパラメーターによって順序付けされます。

質問:複数のフィールドでC#リストを並べ替えるにはどうすればよいですか?

どうもありがとうございました

89
Esabe

ThenByを使用:

Customer.OrderBy(c => c.LastName).ThenBy(c => c.FirstName)

MSDNを参照してください: http://msdn.Microsoft.com/en-us/library/bb549422.aspx

254
David Neale

はい、比較方法を指定することで実行できます。利点は、ソートされたオブジェクトがIComparableである必要がないことです。

   aListOfObjects.Sort((x, y) =>
   {
       int result = x.A.CompareTo(y.A);
       return result != 0 ? result : x.B.CompareTo(y.B);
   });
32
CMinus

オブジェクトを次のようにします

public class MyObject : IComparable
{
    public string a;
    public string b;

    virtual public int CompareTo(object obj)
    {
        if (obj is MyObject)
        {
            var compareObj = (MyObject)obj;
            if (this.a.CompareTo(compareObj.a) == 0)
            {
                // compare second value
                return this.b.CompareTo(compareObj.b);
            }
            return this.a.CompareTo(compareObj.b);
        }
        else
        {
            throw new ArgumentException("Object is not a MyObject ");
        }
    }
}

compareToの戻り値にも注意してください。

http://msdn.Microsoft.com/en-us/library/system.icomparable.compareto.aspx

次に、MyObjectのリストがある場合、.Sort()を呼び出します。

var objList = new List<MyObject>();
objList.Sort();
8
Jason Jong

オブジェクトは IComparable インターフェイスを実装する必要があります。

これにより、クラスはCompareTo(T other)という新しい関数になります。この関数内で、現在のオブジェクトと他のオブジェクトを比較し、最初のオブジェクトが2番目のオブジェクトよりも大きい、小さい、または等しいかどうかについて整数値を返すことができます。

0
Oliver