Freigeben über


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

  • Anonymous
    August 05, 2008
    Piece of cake! var q = from v in values        orderby v.ToCharArray().Aggregate((ch, next) => (char)(next + ch))        select v;

  • Anonymous
    August 05, 2008
    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;

  • Anonymous
    August 05, 2008
    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

  • Anonymous
    August 06, 2008
    var q = from value in values        let intValue = int.Parse(value)        orderby value.Length, intValue        select value;

  • Anonymous
    August 06, 2008
    Bonne nouvelle, Tout comme l'été dernier, Mitsu reprend ses quizz ! Bon j'espère que les prochains vont

  • Anonymous
    August 06, 2008
    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

  • Anonymous
    August 06, 2008
    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.

  • Anonymous
    August 06, 2008
    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

  • Anonymous
    August 06, 2008
    Coquille dans mon précédent commentaire : type anonyme, pas générique ;)

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

  • Anonymous
    August 06, 2008
    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.

  • Anonymous
    August 06, 2008
    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..

  • Anonymous
    August 06, 2008
    Vivement le prochain quizz en espérant arriver plus tôt :)

  • Anonymous
    August 06, 2008
    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...

  • Anonymous
    August 06, 2008
    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

  • Anonymous
    August 07, 2008
    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