2010-11-26 4 views
0

オブジェクトを持つarraylistがいます。ソートする必要があります。C#動的に並べ替えの属性を選択します。

私はこの方法で持って

public Int32 CompareTo(object next) 
     { 
      SessionInfo nextCase = (SessionInfo)next; 
      return (this.Duration.CompareTo(nextCase.Duration)); 
     } 

は、今私はだから私はSortColumnという属性を作って、それに値「期間」

を与えたに「名前」 「期間」からsortvalueを変更dynamiclyする必要があるが

今、私のコードは次のようになります。

public string SortColumn { get; set; } 

public SessionInfo() 
    { 
     SortColumn = "Duration"; 
    } 

public Int32 CompareTo(object next) 
    { 
     SessionInfo nextCase = (SessionInfo)next; 
     return (this.SortColumn.CompareTo(nextCase.SortColumn)); 
    } 

これが機能していません。 ソートする列を変更する方法はありますか?

ありがとう!

答えて

3

ではなくArrayListを、なぜ、あなたは(ほぼ)無料で並べ替えます、一般的なリストを使用しない:

var list = new List<SesionInfo>(); // then add items 
list.Sort((s1,s2) => s1.SortColumn.CompareTo(s2.SortColumn)); 
2
public int CompareTo(object next) 
{ 
    SessionInfo nextCase = (SessionInfo)next; 
    if(SortColumn == "Duration") 
     return (this.Duration.CompareTo(nextCase.Duration)); 
    else if(SortColumn == "Name") 
     return (this.Name.CompareTo(nextCase.Name)); 
} 
0

それが機能していないという理由は、それがでソートされていることですSortColumnプロパティの値とコレクション内のすべてのオブジェクトの値が同じです。これを解決する1つの方法は、リフレクションを使用してSortColumnプロパティで指定されたプロパティの値を取得することです。より良い

など、私は例を単純化するためにNULLかどうかのチェックを残しましたが、あなたは性質が比較可能でない場合は何が起こるかを検討する必要があります、値がnullである

public Int32 CompareTo(object next) 
{ 
     SessionInfo nextCase = next as SessionInfo; 
     var sortProperty = this.GetType().GetProperty(this.SortColumn); 

     var currentValue = sortProperty.GetValue(this) as IComparable; 
     var nextValue = sortProperty.GetValue(next) as IComparable; 

     return currentValue.CompareTo(nextValue); 
} 

解決策は、汎用リストとOrderBy拡張を使用することです。そして、あなたは簡単に行うことができます。

var sorted = collection.OrderBy(c => c.Duration); 

または

var sorted = collection.OrderBy(c => c.Name); 

をごDynamic LINQを使用する場合は、名前で列を指定することができます。

var sorted = collection.OrderBy("Duration"); 
0

はい、私は、あなたが次のような利点を得るよう、常に機能のこの種のための一般的なリストを使用し、同意するだろう

  • タイプ安全
  • パフォーマンスの向上
  • 明示的なキャスト
  • の必要はありません。
  • より良い成長アルゴリズム。

よろしく、

サルザキ

関連する問題