Linq - Recherche expression dans ToList [Résolu]

Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
- - Dernière réponse : Whismeril
Messages postés
12388
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 décembre 2018
- 9 juil. 2015 à 06:46
Bonjour le Forum,

Suite à extraction d'un fichier xml, j'obtiens un ToList
        MyJobs = (From k In MyList, a In k.Applications, j In a.Jobs
Select j.AffecteParent(a, k)).OrderBy(Function(j) j.EnvironnementApplicationJob).ToList()

Pour charger dans un DatagridView
Me.DataGridView1.DataSource = MyJobs

Sur un formulaire, pour afficher une sélection, via un ComboBox, dans le DGV, j'utilise
    Private Sub ComboBoxDDO_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ComboBoxDDO.SelectedIndexChanged
' IsLoading est True quand load DGV ok (function btnPDP_Click)
If IsLoading = True Then
Dim MyFilter As List(Of JOB) = MyJobs.Where(Function(c) (c.DDO = ComboBoxDDO.SelectedItem.ToString())).ToList()
Me.DataGridView1.DataSource = MyFilter
End If
End Sub
Jusqu'ici tout est ok !!!
Mon problème, je souhaiterai, via un bouton de validation et un textbox comprenant la saisie d'une expression, rechercher dans tous les champs (une trentaine) de la ToList "MyJobs" toutes les zones comprenant cette saisie.

Mes recherches sur MSDN et les méthodes Findall, Any, Contains n'ont pas abouti.

Merci de vos conseils pour m'orienter sur la bonne méthode à utiliser.

jean-marc
Afficher la suite 

Votre réponse

4 réponses

Messages postés
12388
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 décembre 2018
0
Merci
Bonsoir,

une précision avant tout, tu n'obtiens pas un ToList, mais une List(of), pour le coup List(Of Job).

La requête retourne une collection Ienumerable.
C'est ce type de collection qui permet l'évaluation différée de la requête, ce qui peut être pratique quand on maitrise bien, mais peut être piégeux quand on débute (et même après!).

J'ai donc évité le piège en forçant l'évaluation immédiate, pour cela il faut convertir le type de collection c'est le rôle de la méthode ToList(), mais il existe aussi ToArray(), ça aurait fait un tableau de Job.


cs_JMO
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
-
Bonsoir Whismeril,

Merci de tes conseils avertis.
Je vais donc potasser MSDN sur la méthode des tableaux.

Bonne soirée,
@+
jean-marc
Whismeril
Messages postés
12388
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 décembre 2018
> cs_JMO
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
-
Mais non un tableau est bien moins pratique qu'une liste. Je voulais essayer de te faire comprendre que ToList n'est pas ton résultat mais une partie des calculs pour obtenir le résultat.
Commenter la réponse de Whismeril
Messages postés
12388
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 décembre 2018
0
Merci
Pour ta question proprement dite.

Il y a trois solutions, soit tu fais une clause where dans laquelle tu évalues chaque champ avec un ou (exemple sur 3 champs)
        Dim texteAChercher As String = "coucou"
        Dim mesJobsFiltres As List(Of Job) = (From j In mesJobs
                                               Where j.EnvName.Contains(texteAChercher) Or j.Host.Contains(texteAChercher) Or j.Name.Contains(texteAChercher)
                                               Select j).ToList()


Tu peux créer une fonction dans Job, qui teste chaque champ est qui retourne True s'il y a une occurrence, ça allégera la requête

 
'la fonction
   Public Function RechercheTousLesChamps(TexteACharcher As String) As Boolean
        RechercheTousLesChamps = False
        If Name.Contains(TexteACharcher) Or EnvName.Contains(TexteACharcher) Or Host.Contains(TexteACharcher) Or EnvName.Contains(TexteACharcher) Then RechercheTousLesChamps = True
    End Function

'la requête adaptée
        Dim texteAChercher As String = "coucou"
        Dim mesJobsFiltres As List(Of Job) = (From j In mesJobs
                                               Where j.RechercheTousLesChamps(texteAChercher)
                                               Select j).ToList()



Enfin tu peux utiliser la réflexion, ça je ne sais pas faire en VB
Commenter la réponse de Whismeril
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
0
Merci
Je vais opter pour ta première proposition.
La recherche d'une expression ne devant être effectuée que sur 3 ou 4 champs au max.
Cela permettra une réponse quasi immédiate puisque inutile de parcourir toutes les colonnes/lignes de la List(Of Job).
J'ai déjà créé une vingtaine de combobox pour choix éventuel de l'utilisateur.
Quand à Réflexion, je n'ai pas regardé plus loin que mon nez cette méthode.

jean-marc
Commenter la réponse de cs_JMO
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
0
Merci
J'ai testé ta première proposition.
Elle répond à ma demande.

Merci,

jean-marc
cs_JMO
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
-
En fait, je ne savais pas que l'on pouvait faire un "Select x).ToList()" sans préciser un champ "Select x.Name).ToList()"
Whismeril
Messages postés
12388
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 décembre 2018
> cs_JMO
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
-
Select retourne l'objet que tu cherches, dans ce cas il doit s'agir d'un job, si tu retournes x.Name, tu auras une erreur de conversion impossible de string vers job.

Par contre si tu as besoin de retourner seulement les Host, là il faut dimensionner une liste de string et retourner x.Host.
Commenter la réponse de cs_JMO

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.