Je viens de commencer à apprendre lambda / linq. Voici ce que j'ai jusqu'ici.

var frequency = from f in "trreill".ToList()
                group f by f into letterfrequency
                select letterfrequency;

foreach (var f in frequency)
{
    Console.WriteLine($"{f.Key}{f.Count()}");
}

Voici la sortie:

t1 r2 e1 i1 l2

Sortie nécessaire:

e1i1l2r2t1

Je ne sais pas comment trier correctement. Des pensées sur ce que je fais mal?

2
MBrewers 20 nov. 2018 à 17:56

3 réponses

Meilleure réponse

La chose qui vous manque est d'ajouter un orderby à votre instruction LINQ:

var frequency = from f in "trreill"
                group f by f into letterfrequency
                orderby letterfrequency.Key
                select new
                {
                    Letter = letterfrequency.Key,
                    Frequency = letterfrequency.Count()
                };

foreach (var f in frequency)
{
    Console.WriteLine($"{f.Letter}{f.Frequency}");
}

Le letterfrequency a une propriété appelée Key qui contient la lettre de chaque groupe, donc l'ajout de orderby letterfrequency.Key trie les résultats pour vous donner la sortie que vous recherchez:

e1

i1

l2

r2

t1

J'ai également légèrement modifié le résultat de la requête (simplement pour montrer que c'est quelque chose de possible) pour générer un nouveau type anonyme qui contient la lettre et la fréquence en tant que propriétés nommées. Cela rend le code du Console.WriteLine un peu plus clair car les propriétés utilisées sont appelées Letter et Frequency plutôt que Key et la méthode Count().

Passant à 11, en utilisant des tuples C # 7.0

Si vous utilisez C # 7.0, vous pouvez remplacer l'utilisation d'un type anonyme par Tuples, cela signifie que le code ressemblerait maintenant à ceci:

var frequency = from f in "trreill"
                group f by f into letterfrequency
                orderby letterfrequency.Key
                select
                (
                    Letter: letterfrequency.Key,
                    Frequency: letterfrequency.Count()
                );


foreach (var (Letter, Frequency) in frequency)
{
    Console.WriteLine($"{Letter}{Frequency}");
}

J'ai a blogué à ce sujet, et il existe de nombreuses autres ressources que les décrivent, y compris ce Stackoverflow question qui demande "Les types anonymes C # sont-ils redondants en C # 7", si vous voulez une plongée plus approfondie dans Tuples, quels sont-ils , comment ils fonctionnent et pourquoi / quand vous voudrez peut-être les utiliser de préférence aux types anonymes.

6
Rob 22 nov. 2018 à 06:27

Je sélectionnerais dans un objet anonyme:

var frequency = from f in "trreill"
                     group f by f into letterfrequency
                     select new { Key = letterfrequency.Key, Count = letterfrequency.Count() };

Ensuite, je le commanderais comme ceci:

foreach (var f in frequency.OrderBy(x => x.Key))
{
    Console.WriteLine($"{f.Key}{f.Count}");
}
1
Bill Tür 20 nov. 2018 à 15:06

Triez simplement votre liste comme suit:

        foreach (var f in frequency.OrderBy(item=>item.Key))
        {
            Console.WriteLine($"{f.Key}{f.Count()}");
        }
2
Ehsan.Saradar 20 nov. 2018 à 15:02