Linq独特-计数


72

我正在寻找对示例对象列表执行查询

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语句,但是这些都没有给我想要的结果。我得到的最接近的日期是给我不同的日期,但包含所有用户。

任何帮助将不胜感激。


9
请添加您尝试过的LINQ语句-这样我们就可以了解为什么它们出错了。
汉斯·

Answers:


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

6
我是Linq的新手,我想知道您将如何用Linq查询语法而不是Linq方法语法编写此代码。
comecme 2011年

1
@comecme我知道您很久以前就离开了此评论,但请在下面查看我对方法语法的翻译。
凯文

3
恐怕您的代码将始终返回Count = 1,那是因为您添加了Disctinct()并使计数一个元素。如果删除该元素,则将具有一定数量的元素。希望这可以帮助!!!;)
GabrielAndrésBrancolini 2015年

例如,对于某些源数组[1,1,2]:distinct count = 2,count =3。显然,它们中的任何一个都不等于1。如果我们需要计算唯一登录名,那么我们确实需要不重复。仅使用Count会给出错误的数字(登录总数,不是唯一的)。
oryol

您能协助代码仅在此处打印最大数量的结果,即02/01/2011-5吗?
阿伦·古普塔

18

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

在查询语法中,它看起来像这样...请注意,对于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()
  });

1
感谢您抽出宝贵时间回答我的评论。
comecme 2014年

10

可以在单个GroupBy通话中完成,

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

2
这是最好的答案。感谢@naveen
JoshYates1980

会产生错误的结果(每天的总会话次数,而不是每天的唯一用户名)
oryol

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

啊,该死的,我真是太棒了,谢谢,我会尽快考虑实施此方法。感谢您及时的回复。
马特·西摩

@aspect-实际上,这为您提供了具有相关唯一用户登录次数的日期,从您的问题出发,您是否还希望将具有相同唯一用户登录数的日期分组?如果这是您想要的,那么只需在按计数选择之后添加另一个组,即可到达!
theburningmonk 2011年

1

解决此问题的另一种方法是分组两次,检查样本

          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();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.