Je ne peux pas savoir comment faire une "trouvaille" sur une liste que j'ai basée sur l'utilisation d'une valeur que je passerai au moment de l'exécution. Si vous voyez mon code ci-dessous, je souhaite pouvoir trouver la classe CustomClass dans la liste pour laquelle le paramètre de chemin est égal à X, où X sera défini au moment de l'exécution.
Des idées Comment faire une telle recherche sur une liste? Ou n'est-ce pas possible sans écrire un itérateur et faire la recherche manuellement? Dans ce cas, il y a peut-être une collection de clé que je devrais regarder en utilisant à la place? P> ps. Je dois admettre que je ne suis pas tout à fait suivre les trucs de prédicats dans le doco à http: / /msdn.microsoft.com/en-us/library/x0b5b5bc.aspx p> p>
8 Réponses :
Vous pouvez écrire
CustomClass cc = this.files.Find( p=> p.Path == u );
Utilisez une Lambda:
static bool matchesUri(CustomClass cc, Uri _u) { return cc.Path == _u; } Uri u = new Uri("www.test.com"); CustomClass cc = this.files.Find(cc => matchesUri(cc, u));
Merci gars - au moyen - aurais-je pu être capable de (si j'étais plus sur C #) l'a effectivement travaillé en regardant simplement la syntaxe de la méthode du doco? (c.-à-d. Paramètres, correspondance, type: Système .. ::. Predicate <(de <(T>)>), le prédicat <(de <(T>)>) Délégué qui définit les conditions de l'élément à rechercher ...
Le type de paramètre limite le type de délégué que vous pouvez passer à la méthode et donc la signature de la méthode ou de la Lambda que vous devez utiliser pour créer ce délégué. En soi, cela ne signifie plus l'utilisation de Lambdas plus que tout autre type de délégué ne le fait. La documentation pour Lambdas est ici: MSDN.Microsoft.com/en-us/Library/ bb397687.aspx
Le délégué est similaire à un pointeur de fonction. En regardant la signature ( délégué Bool Predicate
public void someMethod() { Uri u= new Uri("www.test.com"); CustomClass cc = this.files.find( p => { return p.Path == u; } ); }
Pebcak. PET de cerveau. Faites votre choix.
Essayez d'utiliser la méthode anonyme de recherche et d'utiliser une variable locale que vous souhaitez à l'intérieur. Si cela n'est pas satisfaisant, appelez votre méthode de déléguée normalement définie. P>
Pour l'assurance-maladie seulement, voici ce que vous feriez si vous ne voulez pas utiliser de lambda: puis utilisez-le comme suit: p> public void someMethod()
{
Uri u = new Uri("www.test.com");
UriMatcher matcher = new UriMatcher(u);
CustomClass cc = this.files.Find(matcher.Match);
}
.NET 2.0 Réponse Utilisation d'un délégué anonyme (note que cela ne fonctionne que pour C #, vb.net n'a pas de délégués anonymes).
public void someMethod() { Uri u= new Uri("www.test.com"); CustomClass cc = this.files.find(delegate(CustomClass oTemp) { return oTemp.Path == u;}); }
Dans le poteau de Pavel marqué comme réponse, je pense que la ligne: devrait être plutôt comme: p> c'est parce que le expression à gauche de => est une définition variable (le type est déduit de l'expression) - le compilateur donne une erreur de redéfinition sinon. P> Cette expression peut également être écrite avec une définition explicite comme suit: < / p>
Voici une solution que j'ai utilisée. J'avais besoin de passer plusieurs arguments et je ne voulais rien utiliser qui m'empêcherait d'éditer la méthode pendant l'exécution, alors je suis arrivé à cela.
Évidemment, si vous vouliez que vous puissiez vous modifier à une méthode générique (termes de droite?) Utilisation des arguments de type. Cela se contente également du problème de Lambdas dans une méthode. Je ne sais pas si cela s'applique à des méthodes anonymes aussi ou non, mais il est déjà séparé, donc pas grave. P>
Je ne sais pas si la réflexion aurait une performance frappée ou non. P>
private Predicate<ItemData> FindItemData(string search, string fieldName) { var field = typeof(ItemData).GetField(fieldName); return delegate(ItemData item) { return (string)field.GetValue(item) == search; }; } //in another method... itemlist.Find(FindItemData(e.Row[2].ToString(), "ItemName"));
Je dirai que je n'ai pas vérifié que cela me permettait de faire des modifications, mais sinon cela fonctionne très bien.