7
votes

C # List.Find Méthode - Comment passer une valeur dans le prédicat?

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? xxx

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


0 commentaires

8 Réponses :


1
votes

Vous pouvez écrire

CustomClass cc = this.files.Find( p=> p.Path == u );


0 commentaires

12
votes

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));


3 commentaires

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 (t obj) ) Vous pouvez voir qu'un prédicat est une fonction (méthode) qui prend un paramètre unique de type T , et retourne un bool .



0
votes
public void someMethod()
{
    Uri u= new Uri("www.test.com");
    CustomClass cc = this.files.find( p => { return p.Path == u; } );
}

1 commentaires

Pebcak. PET de cerveau. Faites votre choix.



0
votes

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.


0 commentaires

1
votes

Pour l'assurance-maladie seulement, voici ce que vous feriez si vous ne voulez pas utiliser de lambda: xxx pré>

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);
}


0 commentaires

0
votes

.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;});
}


0 commentaires

0
votes

Dans le poteau de Pavel marqué comme réponse, je pense que la ligne: xxx

devrait être plutôt comme: xxx

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.

Cette expression peut également être écrite avec une définition explicite comme suit: < / p> xxx


0 commentaires

0
votes

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"));


1 commentaires

Je dirai que je n'ai pas vérifié que cela me permettait de faire des modifications, mais sinon cela fonctionne très bien.