Linq verschieden - Anzahl

72

Ich möchte eine Abfrage für eine Beispielliste von Objekten durchführen

Date     Username

01/01/2011 james
01/01/2011 jamie
01/01/2011 alex
01/01/2011 james
02/01/2011 matt
02/01/2011 jamie
02/01/2011 alex
02/01/2011 james
02/01/2011 james
02/01/2011 lucy
02/01/2011 alex
03/01/2011 james
03/01/2011 bob
03/01/2011 bob
03/01/2011 james
03/01/2011 james
04/01/2011 alex
04/01/2011 alex
04/01/2011 alex

Ich möchte linq verwenden, um die Liste der Daten mit der Anzahl der eindeutigen Benutzeranmeldungen abzufragen.

Zum Beispiel:

01/01/2011 - 3
02/01/2011 - 5
03/01/2011 - 2
04/01/2011 - 1

Ich habe eine Reihe von linq-Anweisungen getestet, aber keine davon liefert mir das gewünschte Ergebnis. Das nächste, was ich habe, ist mir die unterschiedlichen Daten zu geben, aber mit einer Anzahl aller Benutzer.

Jede Hilfe wäre sehr dankbar.

Matt Seymour
quelle
9
Bitte fügen Sie die LINQ-Anweisungen hinzu, die Sie versucht haben - dann können wir sehen, warum sie schief gelaufen sind.
Hans

Antworten:

134
logins
  .GroupBy(l => l.Date)
  .Select(g => new
  {
    Date = g.Key,
    Count = g.Select(l => l.Login).Distinct().Count()
  });
Oryol
quelle
6
Ich bin neu in Linq und frage mich, wie Sie dies in Linq-Abfragesyntax anstelle von Linq-Methodensyntax schreiben würden.
Comecme
1
@comecme Mir ist klar, dass Sie diesen Kommentar vor langer Zeit hinterlassen haben, aber sehen Sie sich meine Übersetzung zur Methodensyntax unten an.
Kevin
3
Ich fürchte, Ihr Code gibt immer Count = 1 zurück, weil Sie Disctinct () hinzugefügt haben und das Element zum Zählen bringen. Wenn Sie das entfernen, haben Sie die Anzahl der Elemente. Hoffe das hilft!!! ;)
Gabriel Andrés Brancolini
Zum Beispiel für einige Quell-Arrays [1, 1, 2]: eindeutige Anzahl = 2, Anzahl = 3. Offensichtlich ist nichts von ihnen nicht gleich 1. Wir brauchen dort wirklich eindeutige, wenn wir eindeutige Anmeldungen berechnen müssen. Wenn Sie nur Count verwenden, erhalten Sie eine falsche Nummer (Gesamtzahl der Anmeldungen, nicht eindeutig).
Oryol
Können Sie mit Code helfen, nur das Ergebnis zu drucken, dessen Anzahl hier maximal ist, dh 02/01/2011 - 5?
Arun Gupta
18

Mir ist klar, dass dies eine alte Frage ist, aber ich bin darauf gestoßen und habe den Kommentar über den Wunsch nach Methodensyntax gesehen und konnte mir nicht helfen, sie zu beantworten ... Ich habe möglicherweise eine Codierungsstörung.

In der Abfragesyntax sieht es so aus ... Beachten Sie, dass es für Distinctund keine Abfragesyntax gibtCount

from l in logins
group l by l.Date into g
select new
{
    Date = g.Key,
    Count = (from l in g select l.Login).Distinct().Count() 
};

Für einen direkten Vergleich mit der ursprünglichen Methodensyntax (die mir persönlich besser gefällt) klicken Sie hier ...

logins
  .GroupBy(l => l.Date)
  .Select(g => new
  {
    Date = g.Key,
    Count = g.Select(l => l.Login).Distinct().Count()
  });
Kevin
quelle
1
Vielen Dank, dass Sie sich die Zeit genommen haben, meinen Kommentar zu beantworten.
Comecme
10

Kann innerhalb eines einzelnen GroupBy-Aufrufs durchgeführt werden.

  var Query = list.GroupBy(
                 (item => item.DateTime),
                 (key, elements) => new  { 
                                          key = key,
                                          count = elements
                                                  .Distinct()
                                                  .Count()
                                         }
                 );
Naveen
quelle
2
Das ist die beste Antwort. Danke @naveen
JoshYates1980
es wird ein falsches Ergebnis geben (Gesamtzahl der Sitzungen pro Tag, keine eindeutigen Benutzernamen pro Tag)
oryol
5

So etwas vielleicht?

var list = new List<MyClass>(new[] {
        new MyClass { Date = DateTime.Parse("01/01/2011"), Username = "james" },
        new MyClass { Date = DateTime.Parse("01/01/2011"), Username = "james" },
        new MyClass { Date = DateTime.Parse("01/01/2011"), Username = "alex" },
        new MyClass { Date = DateTime.Parse("01/01/2011"), Username = "james" },
        new MyClass { Date = DateTime.Parse("02/01/2011"), Username = "matt" },
        new MyClass { Date = DateTime.Parse("02/01/2011"), Username = "jamie" },
        new MyClass { Date = DateTime.Parse("02/01/2011"), Username = "alex" },
        new MyClass { Date = DateTime.Parse("02/01/2011"), Username = "james" },
        new MyClass { Date = DateTime.Parse("02/01/2011"), Username = "james" },
        new MyClass { Date = DateTime.Parse("02/01/2011"), Username = "lucy" },
        new MyClass { Date = DateTime.Parse("02/01/2011"), Username = "alex" },
        new MyClass { Date = DateTime.Parse("03/01/2011"), Username = "james" },
        new MyClass { Date = DateTime.Parse("03/01/2011"), Username = "bob" },
        new MyClass { Date = DateTime.Parse("03/01/2011"), Username = "bob" },
        new MyClass { Date = DateTime.Parse("03/01/2011"), Username = "james" },
        new MyClass { Date = DateTime.Parse("03/01/2011"), Username = "james" },
        new MyClass { Date = DateTime.Parse("04/01/2011"), Username = "alex" },
        new MyClass { Date = DateTime.Parse("04/01/2011"), Username = "alex" },
        new MyClass { Date = DateTime.Parse("04/01/2011"), Username = "alex" }
    });

list.GroupBy(l => l.Date, l => l.Username)
    .Select(g => new { 
                Date = g.Key, 
                Count = g.Distinct().Count() 
            });
theburningmonk
quelle
Ahh verdammt, ich war so klein, danke, ich werde mich in Kürze mit der Umsetzung befassen. Danke für die schnelle Antwort.
Matt Seymour
@aspect - tatsächlich erhalten Sie das Datum mit der zugehörigen Anzahl eindeutiger Benutzeranmeldungen. Möchten Sie anhand Ihrer Frage die Daten auch mit der gleichen Anzahl eindeutiger Benutzeranmeldungen gruppieren? Wenn Sie dies möchten, fügen Sie einfach nach der Auswahl durch die Anzahl eine weitere Gruppe hinzu und schon sind Sie da!
Theburningmonk
1

Eine andere Möglichkeit, dies zu lösen, besteht darin, zweimal zu gruppieren und die Probe zu überprüfen

          var dist = listLogins.GroupBy(d => d.date + d.Username)
              .Select(x => x.First())
              .GroupBy(d => d.date).Select(y => new { date = y.Key, count = y.Count() }).ToList();
RameshVel
quelle