4

重複の可能性:
LINQ: 動的文字列パラメーターを使用した orderby

OrderBy() 句を使用して IEnumarable をソートしています。注文したいフィールドを含む値を持つ文字列のリストです。現在、各プロパティ名に switch ステートメントを使用しています。

  swich (propertyname)
    case "name":
      list = list.OrderBy(l=>l.name).ToList();
      break;
    case "property":
      list = list.OrderBy(l=>l.property).ToList();
      .....

文字列「propertyname」を orderby 句の属性として使用する簡単な解決策はありますか?

私がそれを行ったとき、私は望ましいとはほど遠い解決策を得ました。各プロパティをコーディングする作業が増えるだけでなく、将来何らかの属性が追加された場合、この更新は私が書いている関数で忘れられます。

誰かがより良い解決策を持っていることを願っています。

4

2 に答える 2

3
var list = new List<MyClass>();

// Gets an object to give us access to the property with the given name of type MyClass
var propertyInfo = typeof(MyClass).GetProperty(propertyName);

// Each item is ordered by the value of the property
list = list.OrderBy(x => propertyInfo.GetValue(x, null)).ToList();

述語の説明:

var xPropVal = propertyInfo.GetValue(x, null);

プロパティ情報オブジェクトを使用して、オブジェクト x の値を null パラメーターで取得します。この場合、これはプロパティ情報オブジェクトであるため、パラメーターはインデクサーに使用されます。

ただし、この場合のプロパティはすべて単純なプロパティであるため、2 番目のパラメーターは null または空のオブジェクト配列にする必要があります。

于 2012-05-02T11:38:54.020 に答える
1

これを行う最も簡単な方法は、Microsoftが提供するDynamicLinqサンプルを確認することです。スコットガスリーはここにそれについてのブログ投稿を持っています:http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library。 aspx

あなたは簡単にこれを行うことができます:

string propertyname = ...
list.OrderBy(propertyname).ToList();
于 2012-05-02T11:40:56.033 に答える