Linq与众不同 - 伯爵

Mat*_*our 61 c# linq

我期待对对象的示例列表执行查询

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
Run Code Online (Sandbox Code Playgroud)

我想使用linq查询具有唯一用户登录数的日期列表.

例如:

01/01/2011 - 3
02/01/2011 - 5
03/01/2011 - 2
04/01/2011 - 1
Run Code Online (Sandbox Code Playgroud)

我试过了一些linq语句测试,但这些都没有给我想要的结果.我最接近的是给我不同的日期,但有所有用户的数量.

任何帮助将不胜感激.

ory*_*yol 114

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

  • 我是Linq的新手,我想知道如何用Linq查询语法代替Linq方法语法来编写它. (5认同)
  • 我担心你的代码将总是返回Count = 1,这是因为你添加了Disctinct()并将计算一个元素.如果删除它,您将拥有元素数量.希望这可以帮助!!!;) (3认同)

Kev*_*vin 15

我意识到这是一个古老的问题,但我遇到了它并看到了关于想要方法语法的评论,并且无法帮助自己回答它...我可能有编码障碍.

在查询语法中,它看起来像这样......请注意,没有查询语法DistinctCount

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() 
};
Run Code Online (Sandbox Code Playgroud)

为了与原始方法语法(我个人更喜欢)并排比较,你去...

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


nav*_*een 8

可以在单个GroupBy调用中完成,

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

  • 这是最好的答案。谢谢@naveen (3认同)

the*_*onk 5

这样的事可能吗?

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() 
            });
Run Code Online (Sandbox Code Playgroud)