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#リストを並べ替えるにはどうすればよいですか?
どうもありがとうございました
ThenBy
を使用:
Customer.OrderBy(c => c.LastName).ThenBy(c => c.FirstName)
MSDNを参照してください: http://msdn.Microsoft.com/en-us/library/bb549422.aspx
はい、比較方法を指定することで実行できます。利点は、ソートされたオブジェクトがIComparableである必要がないことです。
aListOfObjects.Sort((x, y) =>
{
int result = x.A.CompareTo(y.A);
return result != 0 ? result : x.B.CompareTo(y.B);
});
オブジェクトを次のようにします
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();
オブジェクトは IComparable インターフェイスを実装する必要があります。
これにより、クラスはCompareTo(T other)
という新しい関数になります。この関数内で、現在のオブジェクトと他のオブジェクトを比較し、最初のオブジェクトが2番目のオブジェクトよりも大きい、小さい、または等しいかどうかについて整数値を返すことができます。