2009-08-14 75 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