Exécution d'une requête LINQ simple en parallèle
Je suis toujours très LINQ et PLINQ. En général j'ai juste utiliser des boucles et des List.BinarySearch
dans beaucoup de cas, mais je vais essayer de sortir de cet état d'esprit où je peux.
public class Staff
{
//...
public bool Matches(string searchString)
{
//...
}
}
Utilisation "normale" de LINQ - désolé, je suis familier avec la terminologie - je peux faire ce qui suit:
var matchedStaff = from s
in allStaff
where s.Matches(searchString)
select s;
Mais j'aimerais le faire en parallèle:
var matchedStaff = allStaff.AsParallel().Select(s => s.Matches(searchString));
Lorsque je vérifie le type de matchedStaff
c'est une liste de bool
s, ce qui n'est pas ce que je veux.
Tout d'abord, ce que je fais mal ici, et, deuxièmement, comment puis-je retourner un List<Staff>
à partir de cette requête?
public List<Staff> Search(string searchString)
{
return allStaff.AsParallel().Select(/* something */).AsEnumerable();
}
retourne IEnumerable<type>
pas List<type>
.
source d'informationauteur user1002358 | 2012-12-18
Vous devez vous connecter pour publier un commentaire.
Pour votre première questionil suffit de remplacer
Select
avecWhere
:Select
est un opérateur de projectionpas de filtrage, c'est pourquoi vous obtenez uneIEnumerable<bool>
correspondant à la projection de l'ensemble de votre Personnel des objets à partir de la séquence d'entrée de booléens retourné par votreMatches
appel de méthode.Je comprends qu'il peut être contre-intuitif pour vous de ne pas utiliser
select
à tous, comme il semble que vous êtes plus familier avec la "syntaxe de requête" où le mot-clé choisi est obligatoire ce qui n'est pas le cas à l'aide de la "lambda syntaxe" (ou "fluent syntaxe" ... quelle que soit l'appellation), mais c'est tout 😉Projections opérateurs, tels un
Select
prend comme entrée un élément à partir de la séquence et de transformer les projets de cet élément en quelque sorte à un autre type d'élément (ici, projetant àbool
type). Alors que opérateurs de filtrage, tels queWhere
prend comme entrée un élément à partir de la séquence et soit sortie de l'élément en tant que tel dans la séquence de sortie ou ne sont pas outputing l'élément à tous, sur la base d'un prédicat.Comme pour votre deuxième question
AsEnumerable
retourne unIEnumerable
comme son nom l'indique 😉Si vous souhaitez obtenir un
List<Staff>
vous devriez plutôt appelToList()
(comme son nom l'indique ;)) :Espère que cette aide.
Il n'est pas nécessaire d'abandonner normal syntaxe LINQ pour atteindre le parallélisme. Vous pouvez réécrire votre requête d'origine:
Le parallel LINQ (“PLINQ”) version:
De comprendre d'où le
bool
sont à venir s à partir, quand vous écrivez ce qui suit:Qui est équivalente à la suite de la syntaxe de la requête:
Comme l'a déclaré darkey publiéesi vous souhaitez utiliser la syntaxe C# au lieu de la syntaxe de la requête, vous devez utiliser
()
: