2009-08-14 3 views
1

J'ai une fonction qui renvoie une liste de valeurs de propriété d'une collection:Comment puis-je définir la projection LINQ SelectMany via le paramètre Func?

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(); 
    } 

Je voudrais avoir une version générique qui me permettra de déterminer quel domaine je voudrais projetais - dire au lieu de SpeakerName Je souhaite autoriser la sélection de Video.Length ou Video.Type.

Je comprends que SelectMany utilise un Func, alors quelle est la meilleure façon de rendre le Func configurable pour permettre de le passer en paramètre dans cette fonction?

Répondre

5

Ajoutez la fonction en tant que paramètre à la méthode.

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

je reçois l'erreur suivante lorsque je lance que: Erreur Les arguments de type pour la méthode « System.Linq.Enumerable.SelectMany (System.Collections.Generic.IEnumerable , System.Func >) 'ne peut pas être déduit de l'utilisation. Essayez de spécifier explicitement les arguments de type. –

+2

En fait, je ne pense pas que vous ayez besoin de SelectMany puisque vous ne sélectionnez pas une collection de noms de haut-parleurs, de types ou de longueurs. Vous ne sélectionnez qu'une seule propriété à partir de chacune d'elle, puis faites une distinction sur celle-ci. Cela devrait fonctionner si vous changez SelectMany à Select. – tvanfosson

+1

Pour être plus précis, vous utilisez SelectMany lorsque vous voulez sélectionner une collection d'éléments de chaque élément de l'énumération. Utilisez Sélectionner lorsque vous souhaitez sélectionner une seule propriété de chaque élément de l'énumération. – tvanfosson

Questions connexes