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 ?
foreach (SearchField searchMyField in this.searchFields) if (searchField2Test.ContentManagerFieldName.Equals(objSearchFieldControl.FieldName) { searchField = searchMyField; break; }
Je l'espère mais est-ce évident ?
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 ?
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
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 ?
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.
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 ?
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.