C# List.Trouver la méthode - comment puis-je passer une valeur dans le prédicat?
Je ne peux pas travailler sur la façon de faire un "rechercher" sur une Liste que j'ai basé sur l'utilisation d'une valeur que je vais passer au moment de l'exécution. Si vous voyez ci-dessous mon code, je veux être en mesure de trouver la CustomClass dans la Liste pour laquelle il est Chemin paramètre est égal à X, où X sera défini au moment de l'exécution.
Toutes les idées comment faire une telle trouver sur une Liste? Ou n'est-ce pas possible sans l'écriture d'un itérateur et de faire le rechercher manuellement? Dans quel cas peut-être, il est l'un des principaux ed collection je devrais regarder en utilisant à la place?
private List<CustomClass> files;
public void someMethod()
{
Uri u= new Uri(www.test.com);
CustomClass cc = this.files.find( matchesUri(u) ); //WON'T LET ME DO THIS
}
private static bool matchesUri(List<CustomClass> cc, Uri _u)
{
return cc.Path == _u; }
public class CustomClass
{
private Uri path;
public Uri Path
{
get { return this.path; }
set { this.path = value; }
}
}
PS. Je dois avouer que je n'ai pas tout à fait suivi le prédicat de choses dans le doco à http://msdn.microsoft.com/en-us/library/x0b5b5bc.aspx
OriginalL'auteur Greg | 2009-10-07
Vous devez vous connecter pour publier un commentaire.
Utiliser une lambda:
ou si vous souhaitez encore une méthode nommée:
Type de paramètre limite le type de délégué, vous pouvez passer à la méthode, et donc la signature de la méthode ou lambda vous avez à utiliser pour créer ce délégué. Il n'est pas, en soi, l'utilisation de lambdas plus que tout autre type de délégué. Documentation pour les lambdas est ici: msdn.microsoft.com/en-us/library/bb397687.aspx
Délégué est semblable à un pointeur de fonction. En regardant la signature (
delegate bool Predicate<T>(T obj)
) vous pouvez voir qu'un prédicat est une fonction (méthode) qui prend un seul paramètre de type T, et renvoie un bool.OriginalL'auteur Pavel Minaev
Vous pouvez écrire
La méthode Find() retourne null si aucun élément n'a été trouvée, qui correspond au prédicat.
OriginalL'auteur Jehof
Par souci d'exhaustivité seulement, ici est ce que vous feriez si vous ne souhaitez pas utiliser une lambda:
Et ensuite l'utiliser comme:
Remarque que vous êtes de passage à un référence à une méthode, pas le résultat de la méthode --
Match
vsMatch()
.Vérifier ce fil: Prédicat Délégués en C#.
OriginalL'auteur Groo
PEBCAK. Pet cerveau. Faites votre choix.
OriginalL'auteur Matthew Scharley
Essayez d'utiliser de méthode anonyme pour la recherche et l'utilisation locale de la variable que vous souhaitez à l'intérieur de lui. Si ce n'est pas satisfaisante, appelez votre normalement défini méthode du délégué.
OriginalL'auteur Daniel Mošmondor
.NET 2.0 réponse à l'aide d'un délégué anonyme (notez que cela ne fonctionne que pour le C#, VB.NET n'ont pas de délégués anonymes).
OriginalL'auteur stevehipwell
De Pavel post marqué comme réponse, je pense que la ligne:
devraient plutôt être comme:
C'est parce que l'expression à gauche de => est une définition de la variable (le type est déduit à partir de l'expression) - Le compilateur donne une redéfinition d'erreur sinon.
Cette expression peut aussi s'écrire avec une définition explicite comme:
OriginalL'auteur pasx
Voici une solution que j'ai utilisé. J'avais besoin de passer plusieurs arguments et ne voulait pas l'utiliser tout ce qui pourrait m'empêcher de modification de la méthode en cours d'exécution, alors je suis venu avec cette.
Évidemment, si vous voulais vous pouvez le changer à une méthode générique (bon terme?) en utilisant des arguments de type. Cela aussi permet de contourner le problème de la lambdas dans une méthode. Pas sûr que cela s'applique à des méthodes anonymes ou pas, mais c'est déjà séparé, donc pas de gros problème.
Je ne sais pas si la réflexion aurait une performance ou pas.
OriginalL'auteur Arlen Beiler