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.
Antworten:
logins .GroupBy(l => l.Date) .Select(g => new { Date = g.Key, Count = g.Select(l => l.Login).Distinct().Count() });
quelle
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
Distinct
und 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() });
quelle
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() } );
quelle
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() });
quelle
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();
quelle