2011-02-03 36 views
49

我找对象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 

我想使用LINQ查询日期列表具有独特的用户登录次数的例子名单进行查询。

例如:

01/01/2011 - 3 
02/01/2011 - 5 
03/01/2011 - 2 
04/01/2011 - 1 

我曾尝试为测试了一些LINQ语句,但都未给我想要的结果。我得到的最接近的是给我不同的日期,但有一个所有的用户数。

任何帮助将不胜感激。

+9

请加你想这些LINQ语句 - 然后我们就可以明白为什么他们错在哪里。 – 2011-02-03 09:46:08

回答

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

我是Linq的新手,我想知道如何使用Linq查询语法来编写此代替Linq方法的语法。 – comecme 2011-02-03 11:26:28

+1

@comecme我意识到你在很久以前就离开了这个评论,但是看看我的翻译到下面的方法语法。 – Kevin 2014-12-18 21:33:49

+1

我怕你的代码总是返回Count = 1,这是因为你添加了Disctinct()并且将使得计数一个元素。如果你删除它,你将拥有数量的元素。希望这可以帮助!!! ;) – 2015-11-24 14:40:08

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

可以单一的GroupBy调用内完成,

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

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

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