Recherche dans un tableau

Le
J-L
Bonjour,

Jusque là, quand je voulais vérifier la présence d'un élément dans un
tableau, je parcourais le tableau jusqu'à trouver ou non cet élément.
Pourquoi faire comme ça ? Parce que je n'arrivais pas à utiliser la
méthode Array.Find. Là, je me suis penché dessus (sans tomber), et j'ai
fais ça:

private string chaineCherchee;

private bool Predicat(string chaine)
{
return (chaine == chaineCherchee);
}

private void btnRechercheDansTableau_Click(object sender,
EventArgs e)
{
string[] tablo = new string[5];
tablo[0] = "Lundi";
tablo[1] = "Mardi";
tablo[2] = "Mercredi";
tablo[3] = "Jeudi";
tablo[4] = "Vendredi";

chaineCherchee = "Mercredi";
MessageBox.Show(Array.Find<string>(tablo, Predicat));

chaineCherchee = "Samedi";
MessageBox.Show(Array.Find<string>(tablo, Predicat));

}


L'exemple Microsoft part d'un élément fixe à rechercher dans le
tableau, cet élément étant "hard-code" dans le prédicat.

Je n'ai pas trouvé d'autre solution que celle ci-dessus pour utiliser
la méthode avec un élément dynamique au moment de la recherche.

Encore une fois, je me dis qu'il y a surement beaucoup mieux.

Votre avis svp ?

J-L
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Yanos El Guerilleros
Le #12151981
Salut,

Personnellement pour une simple recherche je me contente de faire un
foreach sur chaque élément.

L'intérêt (à mon humble avis) d'utiliser les méthodes basées sur un
prédicat est quand :
- tu utilises plusieurs de ces méthodes avec les mêmes conditions
(s'enquiquiner à refaire la boucle à chaque fois n'est pas forcément utile)
- tu as plusieurs prédicats possibles en fonction du contexte
- ou tout simplement tu n'as pas envie de faire des boucles ;)

Dans ton cas tu n'as pas beaucoup d'autres choix en effet que de remplir
des champs privés pour exécuter ton prédicat, perso dans un tel cas je
ferais directement ma boucle dans une méthode (sauf si je dois
réutiliser cette condition dans d'autres méthodes Array ).

A++

Yanos

J-L a écrit :
Bonjour,

Jusque là, quand je voulais vérifier la présence d'un élément dans un
tableau, je parcourais le tableau jusqu'à trouver ou non cet élément.
Pourquoi faire comme ça ? Parce que je n'arrivais pas à utiliser la
méthode Array.Find. Là, je me suis penché dessus (sans tomber), et j'ai
fais ça:

private string chaineCherchee;

private bool Predicat(string chaine)
{
return (chaine == chaineCherchee);
}

private void btnRechercheDansTableau_Click(object sender,
EventArgs e)
{
string[] tablo = new string[5];
tablo[0] = "Lundi";
tablo[1] = "Mardi";
tablo[2] = "Mercredi";
tablo[3] = "Jeudi";
tablo[4] = "Vendredi";

chaineCherchee = "Mercredi";
MessageBox.Show(Array.Find<string>(tablo, Predicat));

chaineCherchee = "Samedi";
MessageBox.Show(Array.Find<string>(tablo, Predicat));

}


L'exemple Microsoft part d'un élément fixe à rechercher dans le tableau,
cet élément étant "hard-code" dans le prédicat.

Je n'ai pas trouvé d'autre solution que celle ci-dessus pour utiliser la
méthode avec un élément dynamique au moment de la recherche.

Encore une fois, je me dis qu'il y a surement beaucoup mieux.

Votre avis svp ?

J-L




Agnain
Le #12151971
J-L a écrit :
Bonjour,

Jusque là, quand je voulais vérifier la présence d'un élément dans un
tableau, je parcourais le tableau jusqu'à trouver ou non cet élément.
Pourquoi faire comme ça ? Parce que je n'arrivais pas à utiliser la
méthode Array.Find. Là, je me suis penché dessus (sans tomber), et j'ai
fais ça:

private string chaineCherchee;

private bool Predicat(string chaine)
{
return (chaine == chaineCherchee);
}

private void btnRechercheDansTableau_Click(object sender,
EventArgs e)
{
string[] tablo = new string[5];
tablo[0] = "Lundi";
tablo[1] = "Mardi";
tablo[2] = "Mercredi";
tablo[3] = "Jeudi";
tablo[4] = "Vendredi";

chaineCherchee = "Mercredi";
MessageBox.Show(Array.Find<string>(tablo, Predicat));

chaineCherchee = "Samedi";
MessageBox.Show(Array.Find<string>(tablo, Predicat));

}


L'exemple Microsoft part d'un élément fixe à rechercher dans le tableau,
cet élément étant "hard-code" dans le prédicat.

Je n'ai pas trouvé d'autre solution que celle ci-dessus pour utiliser la
méthode avec un élément dynamique au moment de la recherche.

Encore une fois, je me dis qu'il y a surement beaucoup mieux.

Votre avis svp ?

J-L





Bonjour,

la solution la plus simple consiste à faire ceci :

chaineCherchee = "Mardi";
resultat = Array.Find<string>(tablo, delegate(return
Predicat(chaineCherchee)));
Gilles Kohl [MVP]
Le #12151951
On Wed, 23 Apr 2008 10:01:31 +0200, J-L
Jusque là, quand je voulais vérifier la présence d'un élément dans un
tableau, je parcourais le tableau jusqu'à trouver ou non cet élément.
Pourquoi faire comme ça ? Parce que je n'arrivais pas à utiliser la
méthode Array.Find. Là, je me suis penché dessus (sans tomber), et j'ai
fais ça:

private string chaineCherchee;

private bool Predicat(string chaine)
{
return (chaine == chaineCherchee);
}

private void btnRechercheDansTableau_Click(object sender,
EventArgs e)
{
string[] tablo = new string[5];
tablo[0] = "Lundi";
tablo[1] = "Mardi";
tablo[2] = "Mercredi";
tablo[3] = "Jeudi";
tablo[4] = "Vendredi";

chaineCherchee = "Mercredi";
MessageBox.Show(Array.Find<string>(tablo, Predicat));

chaineCherchee = "Samedi";
MessageBox.Show(Array.Find<string>(tablo, Predicat));

}


L'exemple Microsoft part d'un élément fixe à rechercher dans le
tableau, cet élément étant "hard-code" dans le prédicat.

Je n'ai pas trouvé d'autre solution que celle ci-dessus pour utiliser
la méthode avec un élément dynamique au moment de la recherche.



// ne pas oublier:
using System.Linq;

// ...

private void button1_Click(object sender, EventArgs e)
{
string[] tablo = new string[5];
tablo[0] = "Lundi";
tablo[1] = "Mardi";
tablo[2] = "Mercredi";
tablo[3] = "Jeudi";
tablo[4] = "Vendredi";

// déterminer si une chaine est contenue dans le tableau (LINQ / .NET 3.5)
bool mercrediEstBienLa = tablo.Contains("Mercredi");
MessageBox.Show(mercrediEstBienLa ? "Mercredi y est" : "Pas de mercredi");

// utilisation de Array.Find sans fonction prédicat explicite (délégats anonymes, .NET 2.0ff)
MessageBox.Show("Chercher jeudi donne " +
Array.Find<string>(tablo, delegate(string chaine) { return chaine == "Jeudi"; }));

// trouver les jours de la semaine contenant une lettre "u" ou dont le nom est
// plus long que 7 characteres, les trier par longueur, afficher nom et longueur en parentheses
// (juste pour montrer que LINQ en vaut vraiment la peine :-)
foreach(string resultat in tablo
.Where(s => s.Contains("u") || s.Length > 7)
.OrderBy(s => s.Length)
.Select(s => String.Format("{0} ({1})", s, s.Length)))
{
MessageBox.Show(resultat);
}
}


Amicalement,
Gilles.
Regards,
Gilles [MVP].

(Please reply to the group, not via email.
Find my MVP profile with past articles / downloads here:
http://www.gilleskohl.de/mvpprofile.htm)
Jean-Luc M.
Le #12151941
Salut yanos,

La solution de la boucke est celle que j'utilise le plus souvent mais
il semble qu'il y est des solutions plus élégantes :) d'après les post
ci-dessous

Merci de ton avis sur la question !



--
Jean-Luc M.
Jean-Luc M.
Le #12151931
> chaineCherchee = "Mardi";
resultat = Array.Find<string>(tablo, delegate(return
Predicat(chaineCherchee)));



A part le type qui manquait, il semble que ce qoit la solution la plus
courte. Merci !

--
Jean-Luc M.
Jean-Luc M.
Le #12151921
> // déterminer si une chaine est contenue dans le tableau (LINQ /
.NET 3.5) bool mercrediEstBienLa = tablo.Contains("Mercredi");
MessageBox.Show(mercrediEstBienLa ? "Mercredi y est" : "Pas de
mercredi");

// utilisation de Array.Find sans fonction prédicat explicite
(délégats anonymes, .NET 2.0ff) MessageBox.Show("Chercher jeudi
donne " + Array.Find<string>(tablo, delegate(string chaine) {
return chaine == "Jeudi"; }));

// trouver les jours de la semaine contenant une lettre "u" ou dont
le nom est // plus long que 7 characteres, les trier par longueur,
afficher nom et longueur en parentheses // (juste pour montrer que
LINQ en vaut vraiment la peine :-) foreach(string resultat in tablo
.Where(s => s.Contains("u") || s.Length > 7)
.OrderBy(s => s.Length)
.Select(s => String.Format("{0} ({1})", s, s.Length)))
{
MessageBox.Show(resultat);
}
}





Je suis admiratif ... surtout sur le troisième cas. Mais dans mon cas,
je dois me limiter à .net 2.0 , malheureusement ... Je retiens tout de
même cette élégante façon pour une prochaine application.

Merci également

--
Jean-Luc M.
Agnain
Le #12151911
Jean-Luc M. a écrit :
chaineCherchee = "Mardi";
resultat = Array.Find<string>(tablo, delegate(return
Predicat(chaineCherchee)));



A part le type qui manquait, il semble que ce qoit la solution la plus
courte. Merci !




En effet je suis allé un peu vite...

L'important est que ça vous ait aidé à trouver une solution élégante =)
Publicité
Poster une réponse
Anonyme