2011-12-09 24 views
1

我有一個多線程的應用程序,它在BlockingCollection隊列上創建一個字符串列表,我想把這個字符串列表轉換爲一個或兩個步驟中的項目對象集合使用Lambda和Func的動態構造函數<>

是否有可能創建一個FUNC <>或LAMDA方法來實現這種類型的結果

public class item 
{ 
    public string name { get; set; } 

    public item(string nam) 
    { 
     name = nam; 
    } 


} 

IList<string> alist = new string[] { "bob","mary"}; 

,在那裏你需要一個字符串類型的ILIST <>或IEnumerable的<>和返回的IList

所以對於單個項目Func鍵<>

Func<string, item> func1 = x => new item(x); 

但essetially的signiture會是什麼樣

Func<IEnumerable<string>,IList<item>> func2 = x=> x.ForEach(i => func1(i)); 

難道我試圖把一個圓形掛在sqaure孔或者是我的語法/邏輯只是錯

在此先感謝

回答

4

你將不得不使用,而不是ForEach然後Select投影CON在用vert導致IEnumerable<item>使用ToList()名單 - 這應該工作:

Func<IEnumerable<string>,IList<item>> func2 = x => x.Select(i => new item(i)).ToList(); 
+0

這個回答是最適合我的問題,即使我用烹飪他們的工作一個對待問題 – HoopSnake

5

你只是試圖「重塑」的IList<string>IList<item>

IList<string> listOfStrings = new string[] { "bob","mary"}; 
IList<item> listOfItems = listOfStrings.Select(s => new item(s)).ToList(); 
+0

謝謝你們:-) – HoopSnake

+0

你們是更優雅的解決方案 – HoopSnake

3
IEnumerable<item> myfunc(IEnumerable<string> stringlist) 
{ 
    var q = from s in stringlist 
      select new item(s); 
    return q.ToList(); 
} 
+0

爲什麼叫'ToList()' ,然後有效地轉換回'IEnumerable '?只需直接返回q ... –

+0

感謝他們他們工作的一種享受:-) – HoopSnake

+0

@ReedCopsey如果調用者多次迭代函數結果,則直接返回q會產生多次構造項目對象的風險。記憶豬。 ToList()確保只有一個迭代,一組實例,而不管調用者如何使用函數結果。 – dthorpe

相關問題