Geek Quizz 08: c’est reparti !


Pas sûr d’en faire 12 comme l’année dernière mais il faut bien se lancer, alors allons-y !

Un petit facile pour s’échauffer:

var values = new string[] { "723", "23", "345", "3453", "006" }; var q = ? foreach (var i in q) Console.WriteLine(i);


J’aimerais avoir la liste des mots triée de manière croissante par leur nombre de caractères. Mais à l’intérieur d’un groupe de mots de même longueur, j’aimerais que ceux ci soient triés par la valeur numérique qu’ils représent et obtenir ainsi:

image

C’est parti !!

Mitsu

PS: rappel, il n’y a toujours rien à gagner 🙂

Comments (16)

  1. Alexander says:

    Piece of cake!

    var q = from v in values

           orderby v.ToCharArray().Aggregate((ch, next) => (char)(next + ch))

           select v;

  2. Alexander says:

    Oooops!!! It seems my prev post contains a mistake. The result has a minor difference.

    This looks a bit better:

    var q = from v in values

           orderby v.Length.ToString() + v.ToCharArray().Sum(ch => ch).ToString() + int.Parse(v)

           select v;

  3. Mitsu Furuta says:

    EN: Watch out, computing the sum of caracters makes you loose the sequence information. Moreover, using int.Parse() before adding to a string is useless because the compiler will make a tostring() again on it. (just use ‘+ v’). I am still waiting for more generic (working with types not supporting ‘sum’ even if it smart) and more simple :p.

    FR: Attention, calculer la somme des caractères fait perdre l’information du rang. De plus utiliser int.Parse() pour finalement l’ajouter à une chaine est inutile puisque le compilateur regénèrera un ToString() (autant faire ‘+ v’).

    J’attends une réponse beaucoup plus générique et beaucoup plus simple :p

  4. var q = from value in values

           let intValue = int.Parse(value)

           orderby value.Length, intValue

           select value;

  5. Bonne nouvelle, Tout comme l’été dernier, Mitsu reprend ses quizz ! Bon j’espère que les prochains vont

  6. seb.49 says:

    C’est vrai que là c’est pas dur, je suis un vrai nouveau en linq et j’ai trouvé en 2 minutes.

    Il faut juste que je regare la syntaxe de Matthieu MEZIL : let intValue = int.Parse(value)

    je ne l’ai pas mis dans mon code et j’ai le bon résultat

  7. KooKiz says:

    Constat interessant, la solution de Matthieu Mezil renvoie un IEnumerable, quand une solution sans "let" renvoie un IOrderedEnumerable…

    Solution sans "let" :

    var q = from value in values

          orderby value.Length, int.Parse(value)

          select value;

    Ce qui équivaut en forme condensée à :

    var q = values.OrderBy(i => i.Length).ThenBy(i => int.Parse(i));

    OrderBy and ThenBy renvoyant chacun un IOrderedEnumerable, ça me parait logique. J’ai par contre un peu plus de mal à comprendre pourquoi l’autre solution renvoie un IEnumerable… Savez vous comment le "let" s’exprime en forme condensée ?

    A noter qu’un coup de reflector montre qu’un type générique est créé à l’utilisation de "let". J’aurais donc tendance à privilégier la solution sans.

  8. Matthias says:

    Il est vrai  que déclarer la variable dans la requête Linq génère un peu (mais un peu seulement) plus de code IL et doit donc être un peu plus long à l’exécution…

    Cette méthode :

    from v in (from j in values

                   orderby j

                   select j)

        orderby v.Length

        select v;

    marche tout aussi bien…

    Matthias

  9. KooKiz says:

    Coquille dans mon précédent commentaire : type anonyme, pas générique 😉

  10. Simon says:

    Pfff, c dure de bosser, la réponse était postée avant que je ne voie la question ^^

  11. J’aime bien le let car il rend la requête LINQ plus lisible même si, dans un cas aussi simple, il n’est pas vraiment utile je l’admet.

  12. Mitsu says:

    Cooool,

    Première bonne nouvelle, il y a du monde qui bosse au mois d’août !

    Pour ce premier quizz que j’avais annoncé simple, le but était de montrer l’utilisation des tris en cascade, encore une fois bien connus du monde sql mais auxquels on ne pense pas forcément avec de simples objets.

    var q = from value in values

         orderby value.Length, int.Parse(value)

         select value;

    sera donc la réponse la plus simple. L’utilisation du ‘let’ par Matthieu n’est pas utile mais gardons en tête cette utilisation qui s’avère très utile si l’on doit faire plusieur opérations. Imaginons qu’on veuille également ajouter un filtre sur la valeur numérique:

    var q = from value in values

         let i = int.Parse(value)

         where i < 100

         orderby value.Length, i

         select value;

    Le second quizz dans très bientôt..

  13. Vivement le prochain quizz en espérant arriver plus tôt 🙂

  14. Mitsu Furuta says:

    Au fait, personne n’a répondu à KooKiz pour sa question d’IEnumerable à la place d’IOrderedEnumerable…c’est pas sympa 🙂

    Si personne ne répond je lancerai un quizz dessus un peu plus tard. La réponse est très subtile et il y aura même un indice dans le prochain quizz…

  15. Matthias says:

    Salut,

    puisqu’apparamment c’est à nous de donner toutes les réponses :), je me lance :

    ne serait-ce du au fait que l’inclusion du let "change" le type manipulé (au départ un simple string, puis après cette déclaration un type anonyme {string, int}), les OrderBy et ThenBy s’applique sur ce nouveau type (et renvoit bien un IOrderedEnumerable de {string, int}), et à la fin, est appliqué un nouveau select (pour ne récupérer que le champ de type string) qui lui renvoit un IEnumerable.

    Dans le cas où on ne met pas de let, on travaille uniquement sur des string et on n’a donc pas besoin de re-sélectionner ce string (avec un select)…

    Suis-je proche de La Vérité ?? 🙂

    Un autre truc (plus simple ?) qui marche (mais certainement dans ce cas "particulier") :

    var q = from value in values

                orderby value.Length, value

                select value;

    Pas besoin de parser le string, vu que l’on filtre d’abord par longueur, les 0 ne gènent pas 😉

    Les performances doivent être légèrement meilleures, vu qu’on ne parse plus les string…

    Matthias

  16. Mitsu Furuta says:

    Joli Matthias.

    Je donne une explication générale sur le partage de paramètre dans la réponse au second quizz: http://blogs.msdn.com/mitsufu/archive/2008/08/08/r-ponse-gq08-ii-combinaisons.aspx

Skip to main content