2011-08-01 4 views

Répondre

0

Vous ne savez pas où votre problème est. Je suppose que vous voulez

IEnumerable<string> enumerable = new List<string>(); 
Expression<Func<IEnumerable<string>, IEnumerable<bool>>> expression = a => a.Select(b => b == true); 

Pour augmenter ou réduire automatiquement l'échelle. La chose est, AsParallel() retourne juste une classe qui implémente une méthode GetEnumerator() différente. Il fonctionne toujours sur une interface IEnumerable < T>. Alors, pourquoi ne pas implémenter

Expression<Func<ParallelQuery<TSource>, IEnumerable<bool>>> expression = a => a.Select(b => b == true); 

par défaut? Alors avoir quelque chose comme:

void Execute(Expression<Func<ParallelQuery<string>, IEnumerable<bool>>> expression, IEnumerable<string> strings) 
{ 
    ParallelQuery<string> parStrings; 
    if (!typeof (ParallelQuery<string>).IsAssignableFrom(strings.GetType())) 
     parStrings = strings as ParallelQuery<string>; 
    else 
     parStrings = strings.AsParallel(); 

    expression.Compile()(parStrings); 
} 

Longue histoire courte. Votre expression s'exécute sur ParallelQuery < T> par défaut, et convertit votre IEnumerable < T> en ParallelQuery < T>. Sinon, vous regardez la traversée de nœud/la recomposition de requête. (Je ne sais pas si cela répond à votre question, mais blabbers de toute façon.)

Juste une note d'avertissement Expression.Compile() est une méthode très lourde. Si vous voulez des performances, évitez-le si possible.

Questions connexes