2013-03-12 6 views
5

オブジェクトのリスト内の単一のプロパティまたはフィールドを返す拡張メソッドを作成できますか?オブジェクトのリストで単一のプロパティを収集するにはどうすればよいですか?

現在、私は次のような多くの機能を備えています。

これはハードコードされており、1つのオブジェクトタイプで1つのプロパティのみを提供します。その面倒で、私はLINQ/Reflectionを使って汎用的で再利用可能な方法でこれを行う拡張メソッドを作成する方法があると確信しています。このようなもの:

public static List<TProp> GetProperties<T, TProp>(this List<T> objects, Property prop){ 
    List<TProp> props = new List<TProp>(); 
    foreach (ObjectMotion obj in objects) { 
     props.Add(obj.prop??); 
    } 
    return props; 
} 

LINQを使用する最も簡単な方法は別として、私は最速の方法も探しています。実行時にコード生成(およびラムダ式ツリー)を使用してそのようなメソッドを作成することは可能ですか?私はReflectionを使うよりも速いだろうと確信しています。

+0

あなたの機能は "motions.Select(motion => motion.Speed)"と書くことができます。それはまったく一般的ではありませんが、始めに、毎回メソッドを記述し呼び出すよりもはるかに短いです。 – nvoigt

+0

私のメソッドを呼び出すほうが速いかもしれません。 (通常、LINQは非汎用コードよりも遅い) –

答えて

7

あなたが行うことができます:

public static List<TProp> GetProperties<T, TProp>(this IEnumerable<T> seq, Func<T, TProp> selector) 
{ 
    return seq.Select(selector).ToList(); 
} 

など、それを使用する:

List<int> speeds = motions.GetProperties(m => m.Speed); 

それは、このメソッドは、単によりも優れているかどうかは疑問ですSelectToListを直接使用します。

5

それは、必要に応じて無反射ではありません:

List<int> values = motions.Select(m=>m.Speed).ToList(); 
+0

これを行う拡張メソッドを作成するにはどうすればよいですか?私はこのスニペットを毎回書いたくありません。また、コード生成を使用して最速の方法を作成するにはどうすればよいですか? –

+0

public static List GetValues (このリストターゲット、Func セレクタ){return target.Select(selectoror);} –

+1

機能を作成する必要はありませんが、Select *はすでに関数です –

1

forループは私が思った中で最も速く、linq(closeを使用しない場合は最小限のオーバーヘッド)が続きます。私は他のどのような仕組みもイメージすることはできません。

List<int>int[]に置き換えるか、リストを一定の容量で初期化することができます。それは他のものよりもあなたのコードのスピードを上げるために、おそらくもっと多くのことをするでしょう(しかしそれほど多くはありません)。

関連する問題