OVH Cloud OVH Cloud

Prédicats

4 réponses
Avatar
Boblemar
Bonjour,

Je me suis récemment mis aux prédicats avec les génériques.
Je trouve cela très bien... mais est-il possible de passer des
paramètres à des prédicats.
En clair :
J'ai une liste d'objets.
List<MonObjet> lstMyObj;

Je voudrais faire un find sur un membre du style :
MonObjet obj = lstMyObj.Find("Foo");

Est-ce possible ou dois-je parcourir ma liste pour rechercher la
première occurence ?

Merci

4 réponses

Avatar
Ambassadeur Kosh
delegate anonyme, ou alors un objet, et passer la methode de cet objet en
guise de predicate...
Avatar
Boblemar
Ambassadeur Kosh a écrit :
delegate anonyme, ou alors un objet, et passer la methode de cet objet en
guise de predicate...




J'avais pensé à passer par un objet et une méthode statique pour définir
en membre static mon paramètre, mais pas à un delegate anonyme.

Merci
Avatar
Boblemar
Boblemar a écrit :
Ambassadeur Kosh a écrit :
delegate anonyme, ou alors un objet, et passer la methode de cet objet
en guise de predicate...




J'avais pensé à passer par un objet et une méthode statique pour définir
en membre static mon paramètre, mais pas à un delegate anonyme.

Merci



Question subsidiaire :
Les performances d'un Find à l'aide d'un délegate sont elles meilleurs
que celles d'un foreach + test ?

Par exemple : celles de :

SearchField searchField = this.searchFields.Find(
delegate(SearchField searchField2Test){
return
searchField2Test.ContentManagerFieldName.Equals(objSearchFieldControl.FieldName);
} );

sont elles meilleurs que :

foreach (SearchField searchMyField in this.searchFields)
if
(searchField2Test.ContentManagerFieldName.Equals(objSearchFieldControl.FieldName)
{
searchField = searchMyField;
break;
}


Je l'espère mais est-ce évident ?
Avatar
adebaene
Boblemar wrote:
Boblemar a écrit :
> Ambassadeur Kosh a écrit :
>> delegate anonyme, ou alors un objet, et passer la methode de cet objet
>> en guise de predicate...
>>
>>
> J'avais pensé à passer par un objet et une méthode statique pour définir
> en membre static mon paramètre, mais pas à un delegate anonyme.
>
> Merci

Question subsidiaire :
Les performances d'un Find à l'aide d'un délegate sont elles meilleurs
que celles d'un foreach + test ?

Par exemple : celles de :

SearchField searchField = this.searchFields.Find(
delegate(SearchField searchField2Test){
return
searchField2Test.ContentManagerFieldName.Equals(objSearchFieldControl.Fie ldName);
} );

sont elles meilleurs que :

foreach (SearchField searchMyField in this.searchFields)
if
(searchField2Test.ContentManagerFieldName.Equals(objSearchFieldControl.Fi eldName)
{
searchField = searchMyField;
break;
}


Je l'espère mais est-ce évident ?



Ca dépend du container : Sur un container non trié genre Array ou
List, dans tous les cas la recherche sera linéaire, donc les
performances seront très similaire.

Sur un container trié, ou en arbre, ou une hashtable, le recherche
sera log(N) en temps amorti, voire nettement moins (unitaire) avec une
table de hash avec une fonction de hachage correcte. Ceci-dit, comme le
framework ne définit pour l'instant Find que pour Array et List....

Il n'empêche que AMHA, Find est un meilleur style que la boucle
manuelle (moins de code), donc reste préférable.

Arnaud
MVP - VC