2016-04-25 13 views
1

私は2つのプロパティ、優先順位、次にドロップダウンリストを埋めるための説明で注文したい汎用リストを持っています。動的リストの並べ替え<T>特定のプロパティの

私は私が

list = list.Orderby(x=>x.property1).ThenOrderBy(x=>x.property2). 

私の質問は、私はプロパティ1とproperty2がオブジェクトに存在するかどうかを確認してからに基づく私のリストを並べ替えることができる方法で行うことができますオブジェクトリストの私が今まさにタイプを知っていますそれらの特性。

+7

これらのプロパティがインターフェイスまたはクラスに属する場合は、T –

+1

で制約を使用できます。コンパイラがそれを行います。存在しない場合、コンパイルは失敗します。 – Andrey

+0

あなたは 'List 'を意味しますか? – Xiaoy312

答えて

2

汎用リストを使用しているため、コンパイラはそれをチェックします。例えば

:あなたは

List<Object> list = new List<Object>(); 
var newlist = list.Orderby(x=>x.property1).ThenOrderBy(x=>x.property2); 

のようなコードを書いた場合、コンパイラは、オブジェクトの種類にこれらのプロパティを見つけることができませんので、あなたは、プロパティ1 & property2にコンパイルエラーを取得します。

それぞれが2つのプロパティを持つ必要がある異なるタイプをサポートしたい場合は、2つのプロパティを持つインターフェイスを作成し、サポートする各タイプにそのインターフェイスを実装させてから、 Arturoが提案したようなTに。このメソッドは、インタフェースICanBeSortedを実装するすべての種類を並べ替えることができるようになります

interface ICanBeSorted 
{ 
    string property1 {get;} 
    string property2 {get; 
} 

public List<T> MySortMethod(List<T> list) where T : ICanBeSorted 
{ 
    return list.OrderBy(x=>x.property1).ThenOrderBy(x=>x.property2); 
} 

よう

何か。

+1

私は、user1444433がジェネリックで読んでも気にしないと思います。 – dfdsfdsfsdf

0

あなたはtry-catchブロック内のセレクタをラップすることができます:

Func<dynamic, dynamic> DynamicProperty(Func<dynamic, dynamic> selector) 
{ 
    return x => 
    { 
     try 
     {   
      return selector(x); 
     } 
     catch (RuntimeBinderException) 
     { 
      return null; 
     } 
    }; 
} 

使用法:

var sorted = list 
    .OrderBy(DynamicProperty(x => x.property1)) 
    .ThenBy(DynamicProperty(x => x.property2)); 
0

だけでなく、あなたがそれをやろうとしている方法が悪い考えです。 if-elseを使用してみるか、最初に大文字と小文字を切り替えてから、必要に応じてコードを並べ替えてください。

関連する問題