2009-06-09 11 views
7

名前、年齢、レベルのプロパティを持つPersonクラスがあります。C#List <> 3つのプロパティで注文.Net 2.0

私は

 PersonList.Sort(delegate(Person p1, Person p2) { 
      return p1.Name.CompareTo(p2.Name); 
     }); 

で、特性の一つで注文する方法を知っている。しかし、どのように私は名前、年齢やレベルによって注文することができます。

SQL文のequivalente:名前、年齢、ORDER BY、レベル

+0

C#3.0/.NET 3.5はありますか? – Noldorin

答えて

28

があなたの現在のコードを適応ありがとう:

PersonList.Sort(delegate(Person p1, Person p2) { 
     int r = p1.Name.CompareTo(p2.Name); 
     if (r == 0) r = p1.Age.CompareTo(p2.Age); 
     if (r == 0) r = p1.Level.CompareTo(p2.Level); 
     return r; 
    }); 

や、簡単なLINQっぽいソリューション:

PersonList = PersonList.OrderBy(p => p.Name) 
         .ThenBy(p => p.Age) 
         .ThenBy(p => p.Level).ToList(); 
+0

修正してくれてありがとう、Marc。私は自分の間違いを認識しましたが、インターネットは薄れていて、編集がうまくできませんでした。 –

+0

ああ、あなたはそれを編集しました。チェインOrderBysは動作しません:) – Thorarin

+0

良い! .Net 2.0上で動作する最初のソリューションは完全に機能します。 キングが面倒です。 –

2

私はあなたのPersonクラスにIComparableを含めるでしょう。カスタム比較メソッドでは、3つのプロパティすべてで比較するロジックを設定し、3つが適切な "重み"を持つことを確認できます(たとえば、Personの2つのインスタンスが同じ名前を持つ場合、 )。

4

.NET 3.5への切り替えとLINQの使用について考えましたか?このようなものは、LINQで本当に簡単です:

personList = personList.OrderBy(p => p.Name). 
    ThenBy(p => p.Age).ThenBy(p => p.Level).ToList(); 
1

は、あなたがC#利用できる3.0(LINQのサポートを)持っている場合は、次の操作を行うことができますが、.NET 3.5

IQueryable<Person> people = PersonList.AsQueryable(); 

return people.OrderBy(x => x.Name).ThenBy(x => x.Age).ThenBy(x => x.level); 
0

を使用していると仮定すると:

var result = (from p in PersonList 
       orderby p.Name, p.Age, p.Level 
       select p).ToList(); 
0

LINQ to Objectsを考えましたか?

var x = (from p in PersonList 
     orderby p.Name, p.Age, p.Level 
     select p).ToList(); 
0

は、あなたが返された値を取得する、ことにより、注文したい最初のプロパティでのCompareToを呼び出す必要があり、それが0である場合は、次のプロパティでのCompareToを呼び出し、繰り返し、毎回0であります返された場合は、0以外の値(戻り値)が得られるか、並べ替えるプロパティの最後に到達するまで次のプロパティに進みます。

0
var result = from p in persons 
      orderby p.Name, p.Age, p.Level 
      select p; 
関連する問題