2 Stimmen

etwas komplexes Linq für C#

Ich habe schon einmal eine Frage zum Abrufen der Daten auf dem Server gestellt und habe auf der Website eine Lösung gefunden. Der Vorschlag war, Linq zu verwenden, die perfekt funktioniert, aber da ich relativ neu bin, brauche ich ein wenig in die Tiefe helfen.

Mit Johns Lösung:

class Guy
{
    public int age; public string name;
    public Guy( int age, string name ) {
        this.age = age;
        this.name = name;
    }

}

class Program
{
    static void Main( string[] args ) {
        var GuyArray = new Guy[] { 
        new Guy(22,"John"),new Guy(25,"John"),new Guy(27,"John"),new Guy(29,"John"),new Guy(12,"Jack"),new Guy(32,"Jack"),new Guy(52,"Jack"),new Guy(100,"Abe")};

    var peeps = from f in GuyArray group f by f.name into g select new { name = g.Key, count = g.Count() };

        foreach ( var record in peeps ) {
            Console.WriteLine( record.name + " : " + record.count );
        }

    }
}

Ich kann die Anzahl der Vorkommen von John, Jake und Abe ermitteln, indem ich das oben von John vorgeschlagene Verfahren anwende. Was aber, wenn das Problem etwas komplizierter wäre, zum Beispiel

var GuyArray = new Guy[] { 
new Guy(22,"John", "happy"),new Guy(25,"John", "sad"),new Guy(27,"John", "ok"),
new Guy(29,"John", "happy"),new Guy(12,"Jack", "happy"),new Guy(32,"Jack", "happy"),
new Guy(52,"Jack", "happy"),new Guy(100,"Abe", "ok")};

Der obige Code funktioniert hervorragend, um die Anzahl der Vorkommen der verschiedenen Namen abzurufen, aber was ist, wenn ich die Anzahl der Vorkommen der Namen und auch die Anzahl der Vorkommen jeder Person, die glücklich, traurig oder ok ist, benötige. d.h. die Ausgabe ist: Name, Anzahl der Namen, Anzahl der Namen, die glücklich sind, Anzahl der Namen, die traurig sind, Anzahl der Namen, die in Ordnung sind. Wenn linq nicht die beste Lösung für dieses Problem ist, bin ich bereit, mir alle Alternativen anzuhören. Für Ihre Hilfe bin ich Ihnen sehr dankbar.

7voto

jason Punkte 227577

Ehrlich gesagt ist nicht klar, ob Sie die Gesamtzahl der glücklichen Personen oder die Gesamtzahl der glücklichen Personen nach Namen (auch für traurig, ok) haben wollen. Ich werde Ihnen eine Lösung geben, die Ihnen beides liefert.

var nameGroups = from guy in GuyArray 
                 group guy by guy.name into g
                 select new { 
                     name = g.Key,
                     count = g.Count(),
                     happy = g.Count(x => x.status == "happy"),
                     sad = g.Count(x => x.status == "sad"),
                     ok = g.Count(x => x.status == "ok")
                 };

Dann:

foreach(nameGroup in nameGroups) {
    Console.WriteLine("Name = {0}, Count = {1}, Happy count = {2}, Sad count = {3}, Okay count = {4}", nameGroup.name, nameGroup.count, nameGroup.happy, nameGroup.sad, nameGroup.ok);
}

Wenn Sie die Gesamtzahl der glücklichen, traurigen, ok zählen wollen, können Sie sagen:

Console.WriteLine(nameGroups.Sum(nameGroup => nameGroup.happy));

usw.

Zusätzlich sollten Sie eine Aufzählung erstellen

public enum Mood {
    Happy,
    Sad,
    Okay
}

und dann

class Guy {
    public int Age { get; set; }
    public string Name { get; set; }
    public Mood Mood { get; set; }
}

so dass Sie stattdessen schreiben können:

var people = from guy in guyArray 
             group guy by guy.Name into g
             select new { 
                 Name = g.Key,
                 Count = g.Count(),
                 HappyCount = g.Count(x => x.Mood == Mood.Happy),
                 SadCount = g.Count(x => x.Mood == Mood.Sad),
                 OkayCount = g.Count(x => x.Mood == Mood.Okay)
             };

1voto

Bumble Blee Punkte 79
To do so: 

   class Guy
    {
        public int age; public string name; string mood;
        public Guy( int age, string name,string mood ) {
            this.age = age;
            this.name = name;
            this.mood = mood;
        }

    }

    class Program
    {
        static void Main( string[] args ) {
           var GuyArray = new Guy[] { 
new Guy(22,"John", "happy"),new Guy(25,"John", "sad"),new Guy(27,"John", "ok"),
new Guy(29,"John", "happy"),new Guy(12,"Jack", "happy"),new Guy(32,"Jack", "happy"),
new Guy(52,"Jack", "happy"),new Guy(100,"Abe", "ok")};

        var peepsSad = from f in GuyArray where f.mood=="sad" group f by f.name into g select new { name = g.Key, count = g.Count() };

 var peepsHappy = from f in GuyArray where f.mood=="happy" group f by f.name into g select new { name = g.Key, count = g.Count() };

 var peepsOk = from f in GuyArray where f.mood=="ok" group f by f.name into g select new { name = g.Key, count = g.Count() };

            foreach ( var record in peepsSad ) {
                Console.WriteLine( record.name + " : " + record.count );
            }

  foreach ( var record in peepsHappy ) {
                Console.WriteLine( record.name + " : " + record.count );
            }

  foreach ( var record in peepsOk ) {
                Console.WriteLine( record.name + " : " + record.count );
            }

        }
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X