2015-03-13 33 views
0

我已經查詢過關於SO的問題,但找不到解決方案。將LINQ查詢傳遞給方法來動態地選擇表單集合

在我的程序中是一個類,其唯一原因是從通過構造函數傳遞給它的數據集合中進行選擇。 我需要的是將LINQ查詢傳遞給選擇方法以從所述數據中進行選擇。但是我沒有解決我的問題的運氣。 下面是代碼:

public class ServiceClient<TInput> 
{ 
    private readonly IEnumerable<TInput> data; 

    public ServiceClient(IEnumerable<TInput> dataInput) 
    { 
     this.data = dataInput; 
    } 

    public TResult Send<TResult>(Func<IEnumerable<TInput>, TResult> selector) 
    { 
     var selectedData = this.data.Select(selector); // How to do the selection here??? 

     // ... 
    } 
} 

類被稱爲是這樣的:

private static void Main(string[] args) 
{ 
    var persons = new List<Person> 
    { 
     new Person { Id = 0, FamilyId = 0 }, 
     new Person { Id = 1, FamilyId = 0 }, 
     new Person { Id = 2, FamilyId = 1 } 
    }; 

    var func = new Func<IEnumerable<Person>, Person>(Target); 

    var client = new ServiceClient<Person>(persons); 

    client.Send(func); 
} 

private static Person Target(IEnumerable<Person> enumerable) 
{ 
    return enumerable.SingleOrDefault(p => p.Id == 0); 
} 

回答

4

替換:

var selectedData = this.data.Select(selector); 

有:

var selectedData = selector(this.data); 

它應該是足夠的。 selector是加入收集並返回單個元素的委託,因此您需要使用data參數調用selector委託。

如果你想使用Selectthis.data.Select(..)selector委託而應像Func<TInput, TResult> - 代表投射一個元素到另一個。

+0

嗯,這很容易。似乎我必須更熟悉funcs關於該主題的任何好建議? – Ruhrpottpatriot 2015-03-13 15:34:49

+0

我向你推薦一本好書:http://www.amazon.com/Programming-Microsoft%C2%AE-PRO-Developer-Paolo-Pialorsi/dp/0735624003我讀過它,發現非常有用。 – 2015-03-14 06:00:45

+0

會試試看,謝謝。 – Ruhrpottpatriot 2015-03-14 19:16:15

0

您需要更改發送這種方式:

public TResult Send<TResult>(Func<IEnumerable<TInput>, TResult> selector) 
{ 
    return selector(data); 
} 
相關問題