2011-12-16 9 views
0

以下は私がそれをどれぐらい作りましたか? Get関数にFunc<T,string>の代わりにExpression<Func<T, string>>をパラメータとして送信する必要がありますが、依然としてSelect()が機能しています。これは簡単に可能ですか?これはLinqPadにフォーマットされています。C#<T>とExpression <Func <T, string>>セレクタをT.Select(セレクタ)にするにはどうすればいいですか?

void Main() 
{ 
    // Setup sample data in wholelist 
    var wholelist = new List<Example>(); 
    for (var a = 0; a < 10; a++) 
    { var t = new Example { id = a.ToString(), name = a.ToString() }; 
     wholelist.Add(t); 
    } 

    // Do the real work 
    var names = Get<Example>(wholelist, p => p.name); 
    // LinqPad shows content 
    names.Dump(); 
} 

public class Example 
{ 
    public string id {get;set;} 
    public string name {get;set;} 
} 

public static List<string> 
    Get<T>(IEnumerable<T> source, Func<T, string> selector) 
{  
    var list = source.Select<T,string>(selector).ToList(); 
    return list; 
} 

ザ・なぜ我々はすでにExpression<Func<T,string>>と、このいずれかを呼び出す機能の多くを持っているためです。

答えて

2

expression.Compileを試しましたか?

public static List<string> Get<T>(IEnumerable<T> source, Expression<Func<T, string>> selector) 
{ 
    var list = source.Select<T, string>(selector.Compile()).ToList(); 
    return list; 
} 
+0

ファンタスティック。私はそれが何か簡単でなければならないことを知っていた。 –

+0

うれしいことです。名前を愛して、btw。 このメソッドが頻繁にヒットする場合は、Compileの結果を一時的にキャッシュすることを検討する価値があります。ディスカッション: http://stackoverflow.com/questions/258864/when-an-expressiont-is-compiled-is-it-implicitly-cached –

関連する問題