Ответ 1
logins
.GroupBy(l => l.Date)
.Select(g => new
{
Date = g.Key,
Count = g.Select(l => l.Login).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, но ни один из них не дает мне желаемого результата. Самое близкое, что у меня есть, дает мне отличные даты, но со счетом всех пользователей.
Любая помощь будет принята с благодарностью.
logins
.GroupBy(l => l.Date)
.Select(g => new
{
Date = g.Key,
Count = g.Select(l => l.Login).Distinct().Count()
});
Я понимаю, что это древний вопрос, но я наткнулся на него и увидел комментарий о желании синтаксиса метода и не мог ответить на него... Я может иметь расстройство кодирования.
В синтаксисе запроса это выглядит так: обратите внимание, что для Distinct
и Count
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()
};
Для сравнения бок о бок с исходным синтаксисом метода (который мне лично нравится лучше) здесь вы идете...
logins
.GroupBy(l => l.Date)
.Select(g => new
{
Date = g.Key,
Count = g.Select(l => l.Login).Distinct().Count()
});
Может выполняться в рамках одного вызова GroupBy,
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();