6

オブジェクトのリスト内の単一のプロパティまたはフィールドを返す拡張メソッドを作成することは可能ですか?

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

public static List<int> GetSpeeds(this List<ObjectMotion> motions) {
    List<int> speeds = new List<int>();
    foreach (ObjectMotion motion in motions) {
        speeds.Add(motion.Speed);
    }
    return speeds;
}

これは「ハード コード」されており、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 を使用した最も簡単な方法とは別に、最速の方法も探しています。コード生成 (および Lambda 式ツリー) を使用して、実行時にそのようなメソッドを作成することは可能ですか? Reflectionを使用するよりも高速になると確信しています。

4

3 に答える 3

7

つまり、リフレクションは必要ありません。

List<int> values = motions.Select(m=>m.Speed).ToList();
于 2013-03-12T13:56:09.347 に答える
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);

ただし、この方法がSelectand をToList直接使用するよりも優れているかどうかは疑問です。

于 2013-03-12T13:59:16.537 に答える
1

for ループが最速だと思いますが、それに続いて linq が続きます (クロージャーを使用しない場合のオーバーヘッドは最小限です)。それよりも優れたメカニズムが他にあるとは思えません。

を に置き換えるか、リストを特定の容量で初期化するList<int>ことができます。int[]これはおそらく、他の何よりもコードを高速化するのに役立ちます (ただし、それほど多くはありません)。

于 2013-03-12T14:00:15.913 に答える