Linq distinct-Count
Я ищу, чтобы выполнить запрос на примере списка объектов
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
Я хочу использовать LINQ для запроса списка дат с числом уникальных пользователей.
например:
01/01/2011 - 3
02/01/2011 - 5
03/01/2011 - 2
04/01/2011 - 1
Я пробовал как проверено ряд операторов linq, но ни один из них не дает мне желаемого результата. Самое близкое, что у меня есть, - это дать мне разные даты, но с подсчетом всех пользователей.
любая помощь была бы очень оцененный.
5 ответов:
logins .GroupBy(l => l.Date) .Select(g => new { Date = g.Key, Count = g.Select(l => l.Login).Distinct().Count() });
Я понимаю, что это древний вопрос, но я наткнулся на него и увидел комментарий о желании синтаксиса метода и не мог помочь себе ответить на него... Я мая нарушение кодировки.
в синтаксисе запроса это выглядит так... обратите внимание, что синтаксис запроса для
DistinctиCountfrom 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() };для параллельного сравнения с оригинальным синтаксисом метода (который лично мне нравится больше) здесь вы идете...
logins .GroupBy(l => l.Date) .Select(g => new { Date = g.Key, Count = g.Select(l => l.Login).Distinct().Count() });
может быть сделано в рамках одного группового вызова,
var Query = list.GroupBy( (item => item.DateTime), (key, elements) => new { key = key, count = elements .Distinct() .Count() } );
что-то вроде этого возможно?
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() });
другой способ решить эту проблему-сгруппировать дважды, проверить образец
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();
Comments