2

リストのメンバーに対してカスタム操作を実行し、実行するプロパティを指定できるようにしたいのですが、結果をプロパティに割り当てるための正しい構文を見つけるのに苦労しています。

例 :

以下のような用語のリストがあり、それらの「頻度」を正規化したいと考えています。

public class Term
{
    public string Name { get; set; }
    public double Frequency { get; set; }
    public double Weight { get; set; }
}

このような構文を使用して、操作を行っているプロパティを指定できるはずです。

List<Term> list = Normalize(artist.Terms, s => s.Frequency);

(ここでは「Term」の「Frequency」ですが、任意のタイプの任意のプロパティでそれを実行できるはずです。プロパティ タイプは常に double になります)

それが私が作成したものですが、操作を実行する方法も結果をプロパティに割り当てる方法もわかりません:

private static List<T> Normalize<T>(List<T> elements, Func<T, double> func)
{
    List<T> list = new List<T>();
    double fMin = elements.Min(func);
    double fMax = elements.Max(func);
    double fDelta = fMax - fMin;
    double fInv = 1.0d / fDelta;
    for (int i = 0; i < elements.Count; i++)
    {
        T t = elements[i];

        // What should I do from here ?
        //double invoke = func.Invoke(term);
        //term.Frequency = (term.Frequency - fMin) * fInv;
     }
    return list;
}

どのようにこれを達成しますか?

4

2 に答える 2

4

を使用しExpressionて、プロパティへのハンドルを取得できます。

private static List<T> Normalize<T>(List<T> elements, Expression<Func<T, double>> func)
{
    //...
    var expr = (MemberExpression)func.Body;
    var property = expr.Member as PropertyInfo;
    if (property != null)
        property.SetValue(/* element */, /* new value */);
    //...
}

さらに、 を使用することをお勧めしIEnumerableます。これはより柔軟で、いつでもリストに変換できます。

 private static IEnumerable<T> Normalize(...)
 {
     foreach(...)
     {
         yield return ...;
     }
 }
于 2013-06-23T16:31:53.433 に答える