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:
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 :pAnonymous
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 vontAnonymous
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ésultatAnonymous
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... MatthiasAnonymous
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... MatthiasAnonymous
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