C# Linq不同计数

C# Linq不同计数,c#,linq,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 0

我希望对对象的示例列表执行查询

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()
  });
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 list=新列表(新[]{
新MyClass{Date=DateTime.Parse(“01/01/2011”),Username=“james”},
新MyClass{Date=DateTime.Parse(“01/01/2011”),Username=“james”},
新的MyClass{Date=DateTime.Parse(“01/01/2011”),Username=“alex”},
新MyClass{Date=DateTime.Parse(“01/01/2011”),Username=“james”},
新MyClass{Date=DateTime.Parse(“02/01/2011”),Username=“matt”},
新的MyClass{Date=DateTime.Parse(“02/01/2011”),Username=“jamie”},
新的MyClass{Date=DateTime.Parse(“02/01/2011”),Username=“alex”},
新MyClass{Date=DateTime.Parse(“02/01/2011”),Username=“james”},
新MyClass{Date=DateTime.Parse(“02/01/2011”),Username=“james”},
新MyClass{Date=DateTime.Parse(“02/01/2011”),Username=“lucy”},
新的MyClass{Date=DateTime.Parse(“02/01/2011”),Username=“alex”},
新MyClass{Date=DateTime.Parse(“03/01/2011”),Username=“james”},
新MyClass{Date=DateTime.Parse(“03/01/2011”),Username=“bob”},
新MyClass{Date=DateTime.Parse(“03/01/2011”),Username=“bob”},
新MyClass{Date=DateTime.Parse(“03/01/2011”),Username=“james”},
新MyClass{Date=DateTime.Parse(“03/01/2011”),Username=“james”},
新的MyClass{Date=DateTime.Parse(“04/01/2011”),Username=“alex”},
新的MyClass{Date=DateTime.Parse(“04/01/2011”),Username=“alex”},
新MyClass{Date=DateTime.Parse(“04/01/2011”),Username=“alex”}
});
list.GroupBy(l=>l.Date,l=>l.Username)
.Select(g=>new{
日期=g.键,
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();

可以在单个GroupBy调用中完成

  var Query = list.GroupBy(
                 (item => item.DateTime),
                 (key, elements) => new  { 
                                          key = key,
                                          count = elements
                                                  .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()
  });

我认为在奥里尔的回答中不需要有明确的计数。groupup自动拾取不同的键,并且可以作为g.key访问

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

请添加您尝试过的那些LINQ语句,然后我们就可以了解它们出错的原因了。啊,达姆,我真是太棒了,谢谢您,我很快就会研究如何实现它。感谢您的快速回复。@aspect-实际上,这会为您提供具有关联的唯一用户登录数的日期,从您的问题中可以看出,是否也要将具有相同唯一用户登录数的日期分组?如果这是您想要的,那么只需在“按计数选择”之后添加另一个group by,您就到了!我是Linq新手,我想知道你将如何用Linq查询语法而不是Linq方法语法来编写此注释。@comecme我知道你很久以前就留下了此注释,但请查看下面我对方法语法的翻译。恐怕你的代码将始终返回Count=1,这是因为你添加了Disctinct(),并使to Count成为一个元素。如果删除该选项,将获得元素的数量。希望这有帮助!!!;)例如,对于某些源数组[1,1,2]:distinct count=2,count=3。显然,它们中没有一个不等于1。如果我们需要计算唯一的登录名,那么我们确实需要使用distinct。使用just Count将给出错误的数字(总登录次数,不是唯一的)。如果不使用distinct,则给出此日期的总登录会话次数。即使它们是针对同一用户的。使用distinct-它提供每个日期登录的用户数。可能您的数据结构/目标编号略有不同,谢谢您花时间回答我的评论。这是最好的答案。感谢@navenit将给出错误的结果(每天的会话总数,而不是唯一的用户名)