2009-10-01 9 views
0

Dans la signature d'une méthode que je précise un Func, comme ceci:Passing Func paramètre de méthode dans une méthode LINQ (types génériques)

public void Method (Func<string, bool> func) 

Dans LINQ, la méthode (de IEnumerable) me laisser passer dans un Func du paramètre de méthode à la requête LINQ? L'autre problème est que ma fonction peut avoir n'importe quel paramètre (s) de sorte que la méthode de IEnumerable/LINQ doit supporter les espaces génériques.

Je veux écrire quelque chose comme ceci:

// Get all elements of type T from the webpage (find is an object in an external API to look for elements in a page). 

IEnumerable<T> images = find.GetAllByTagName<T>().All(func); 

// Where func is a method parameter which is assigned at run time by the consumer of this API: 

public void Test (Func<T, bool> func) { } 

Comment puis-je faire mieux? Je suis sur .NET 3.5

Merci

+3

Vous connaissez le type de retour de .Toutes() est un booléen, pas un IEnumerable, non? Vous voulez probablement .Where() à la place. –

Répondre

1

Dans LINQ, quelle méthode (de IEnumerable) me laisse passer un Func du paramètre method à la requête LINQ?

Les méthodes d'extension de LinqToObjects se déroulent sur la classe System.Linq.Enumerable statique.


Étant donné votre signature Func, vous voulez probablement this surcharge de Enumerable.Where.

IEnumerable<T> Enumerable.Where<T>(this IEnumerable<T> source, Func<T, bool> filter)

+0

Oui. J'ai vu où mais je n'ai pas remarqué la surcharge (je n'ai pas besoin int). C'est pourquoi j'ai eu le problème au début. – dotnetdev

1

Changement d'être ouvert la signature de votre API:

public void Method<T> (Predicate<T> func) 

Votre consommation fermerait la signature générique avec un type T, et fournir une prédicats appropriée.

La mise en œuvre de la méthode réelle en utilisant LINQ utiliserait ci-dessus Où est Joel()

Edit: changé func à prédicat

Modifier supplémentaires:

Je rentrais personnellement un IEnumerable représentant votre jeu de résultats limité par le prédicat transmis:

public IEnumerable Method<T> (Predicate<T> func) 
{ 
    return find.Where(func) 
} 

Je fais quelques suppositions de ce que vous essayez de faire, laissez-moi savoir si c'est votre intention.

+0

Plus lisible que public void Méthode (Prédicat func) – recursive

+1

Le prédicat ne rentre pas dans une clause Where, pas de conversion entre le prédicat et Func . Vous pouvez cependant placer thePredicate.Invoke dans la clause Where. Il sera converti en un Func . –

+0

Intéressant, merci Juda. Je pensais que ce serait une hypothèse sûre que cela fonctionnerait comme une distribution implicite. – gn22

0

Dans LINQ, la méthode (de IEnumerable) me laisser passer dans un Func du paramètre de méthode à la requête LINQ?

Cette question est un peu floue pour moi. Si vous êtes à la recherche d'un algorithme de filtre qui renvoie uniquement les résultats spécifiés par le Func, utilisez la méthode .Lorsque:

public void Method (Func<string, bool> func) 
{ 
    return find.GetAllByTagName<T>().Where(func); 
} 

Est-ce que cela répond à votre question? Si non, veuillez clarifier ce que vous essayez de faire.

+0

Je vais essayer quand je monte sur ma machine de travail. Je pense que je me suis précipité le codage en raison de pressions externes (pas de faute autre que le mien). – dotnetdev

Questions connexes