Linq distinct - Count - программирование
Подтвердить что ты не робот

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, но ни один из них не дает мне желаемого результата. Самое близкое, что у меня есть, дает мне отличные даты, но со счетом всех пользователей.

Любая помощь будет принята с благодарностью.

4b9b3361

Ответ 1

logins
  .GroupBy(l => l.Date)
  .Select(g => new
  {
    Date = g.Key,
    Count = g.Select(l => l.Login).Distinct().Count()
  });

Ответ 2

Я понимаю, что это древний вопрос, но я наткнулся на него и увидел комментарий о желании синтаксиса метода и не мог ответить на него... Я может иметь расстройство кодирования.

В синтаксисе запроса это выглядит так: обратите внимание, что для 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()
  });

Ответ 3

Может выполняться в рамках одного вызова GroupBy,

  var Query = list.GroupBy(
                 (item => item.DateTime),
                 (key, elements) => new  { 
                                          key = key,
                                          count = elements
                                                  .Distinct()
                                                  .Count()
                                         }
                 );

Ответ 4

Что-то вроде этого может быть?

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() 
            });

Ответ 5

Другим способом решения этой проблемы является группировка дважды, проверьте образец

          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();