none
Je m'initie à Linq... RRS feed

  • Question

  • Bonjour. Première fois que je poste sur ce forum.

    J'espère que ma question de trouve au bon endroit.

    Soit un tableau de string MotsDe10Lettres() (la liste de tous les mots de 10 lettres). J'extraie tous les mots commençant par "ma" en écrivant :

    Dim TableauMa = From word in MotsDe10Lettres where word.substring(0,2) = "ma" select word

    Maintenant je veux trouver toutes les lettres distinctes possibles en 3ème position après "ma" sous forme d'une simple string (exemple : "aeioru")

    Je le fais rapidement et de manière plus traditionnelle en boucle for sur TableauMa.

    Mais je voudrais trouver plus élégant : obtenir cette string dans une formulation Linq unique, et, étant nouveau dans Linq, je n'y arrive pas...

    Si quelqu'un pouvait m'aider, je lui en serais très reconnaissant... et serais très curieux de la réponse.

    Très cordialement.



    lundi 28 janvier 2019 12:16

Toutes les réponses

  • Bonjour,

    Tout d'abord je vous conseillerais d'utiliser word.StartsWith("ma") au lieu d'un Substring() car si votre mot à moins de 2 caractères dans votre cas, vous aurez une exception. De plus StatsWith() est optimisée par rapport à un Substring()+Comparaison.

    La requête suivante extrait la liste des "troisièmes lettres" des mots qui commence par "ma".

    Dim lettres = From word In MotsDe10Lettres Where word.StartsWith("ma", StringComparison.OrdinalIgnoreCase) And word.Length>2 Select word(2)

    J'utilise StartsWith() pour les raisons invoquées précédemment, avec une comparaison qui ignore la différence entre majuscule/minuscule pour la recherche. De plus je m'assure que le mot à plus de 2 lettres car sinon il y aura une exception si on accède au troisième caractère d'une chaîne trop petite. Pour finir je fais un select sur le troisième caractère "word(2)" (les chaînes de caractères en .NET on leur premier caractères à l'index 0, donc pour accéder au troisième caractère il faut utiliser l'index 2).

    On obtient un tableau de caractères.

    Pour transformer tout cela en texte (chaîne de caractère) il suffit d'utiliser String.Concat()

    Dim lettresEnChaine = String.Concat(lettres)

    Bien sur vous pouvez combiner l'ensemble dans une seule instruction

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.



    lundi 28 janvier 2019 14:49
  • Je vous remercie pour votre réponse rapide.

    Je n'ai pas assez insisté sur le fait que le tableau ne comportait que des mots de 10 lettres, et toutes en minuscules, c'est pourquoi je n'ai pas filtré les mots par la longueur.

    Je vous remercie particulièrement pour le renseignement concernant la vitesse d'analyse de StartsWith par rapport à Substr.

    J'ai transformé votre proposition en :

    Dim lettres = From word In MotsDe10Lettres Where word.StartsWith("ma") Select word(2) Distinct

    Et enfin, en une seule ligne :

    Dim lettres = String.Concat (From word In MotsDe10Lettres Where word.StartsWith("ma") Select word(2) Distinct)

    Je n'y serai pas arrivé sans vous.

    Merci infiniment

    Cordialement

    lundi 28 janvier 2019 18:11
  • Bonjour,

    Non j'avais bien compris l'histoire des mots de 10 lettres (le nom de la variable MotsDe10Lettres m'avait mis la puce à l'oreille ;) ) c'était juste pour rappeler du risque d'essayer d'accéder à une position qui n'existe pas dans une chaine :)

    Sur ces forums quand une réponse apporte une solution, il est de bon ton de la "Marquer comme réponse" ainsi en cas de recherche on sait que cette question à une réponse. 

    Vous pouvez également voter pour une réponse quand elle apporte quelque chose à la discussion.

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    mardi 29 janvier 2019 07:57