2009-08-14 125 views
1

我已經從集合返回屬性值列表的功能:如何通過Func參數設置LINQ SelectMany投影?

public static List<string> GetSpeakerList() 
    { 
     var Videos = QueryVideos(HttpContext.Current); 
     return Videos.Where(v => v.Type == "exampleType" 
      .SelectMany(v => v.SpeakerName) 
      .Distinct() 
      .OrderBy(s => s) 
      .ToList(); 
    } 

我想有一個通用版本,這將讓我確定哪個領域,我想預測 - 說的不是SpeakerName我想允許選擇Video.Length或Video.Type。

我知道SelectMany需要一個Func,那麼讓Func可配置爲允許將它作爲參數傳遞給此函數的最佳方法是什麼?

回答

5

將函數作爲參數添加到方法中。

public static List<string> GetVideosAttribute(Func<Video,string> selector) 
{ 
    var Videos = QueryVideos(HttpContext.Current); 
    return Videos.Where(v => v.Type == "exampleType" 
       .Select(selector) 
       .Distinct() 
       .OrderBy(s => s) 
       .ToList(); 
} 


var speakers = GetVideosAttribute(v => v->SpeakerName); 
var topics = GetVideosAttribute(v => v->Topic); 
+0

我得到以下錯誤,當我運行: 錯誤\t \t 7的類型參數方法「System.Linq.Enumerable.SelectMany (System.Collections.Generic.IEnumerable , System.Func >)'不能從使用情況推斷。嘗試明確指定類型參數。 – 2009-08-14 17:19:58

+2

其實我不認爲你需要SelectMany,因爲你實際上並沒有選擇揚聲器名稱,類型或長度的集合。你只是從每個選擇一個屬性,然後做一個獨特的。如果您將SelectMany更改爲選擇,它應該可以工作。 – tvanfosson 2009-08-14 17:33:11

+1

更確切地說,當您想從枚舉中的每個元素中選擇一個元素集合時,就使用SelectMany。如果要從枚舉中的每個元素中選擇一個屬性,請使用選擇。 – tvanfosson 2009-08-14 17:34:17