Linq Group按日期列出对象列表

时间:2016-01-10 02:50:39

标签: c# .net linq

我正在寻找一种按日期获得分组列表的方法。

我按日期成功排序了我的列表,但我可以想一下如何在新列表中获取包含所有分组对象的列表。

List<PersonneWithDate> personneList = GetPersonnelsByDay ();
var groups = from p in personneList
    group p by new { day = p.Date.Day, month = p.Date.Month , year= p.Date.Year } into d
    select new { dt = string.Format("{0}/{1}/{2}", d.Key.day,d.Key.month,d.Key.year), count = d.Count()};

给我一​​个列表,其中包含一个具有dt和count但是我想要分组的所有PersonneWithDate的对象。

我该怎么做?

3 个答案:

答案 0 :(得分:1)

我不确定我是否理解你的问题,但这是你所追求的吗?

List<PersonneWithDate> personneList = GetPersonnelsByDay();
var groups =
(
    from p in personneList
    group p by p.Date.Date into d
    select new
    {
        dt = d.Key.ToShortDateString(),
        count = d.Count(),
        personnel = d.ToList(),
    }
).ToList();

(我也简化了查询分组。)

答案 1 :(得分:0)

你可以这样做

  1. 而是按包含日,月和年的匿名对象分组,您可以按Date.Date
  2. 进行分组
  3. 然后选择创建具有3个属性的匿名对象
      类型为string
    1. dt ,日期为字符串格式
    2. 类型int
    3. ,此日期的总人数
    4. 类型为IEnumerable<PersonneWithDate>
    5. ,其中包含人员集合。
  4. 请参阅以下代码:

    List<PersonneWithDate> personneList = GetPersonnelsByDay();
    var groups = from p in personneList
                 group p by p.Date.Date into d
                 select new
                 {
                     dt = d.Key.ToString("dd/MM/yyyy"),
                     count = d.Count(),
                     // if you need that persons collection should be a list, then call .ToList() after Select()
                     persons = d.Select(t => t)
                 };
    

    Lambda方式

    List<PersonneWithDate> personneList = GetPersonnelsByDay();
    var groups = personneList.GroupBy(p => p.Date.Date).Select(d => new
    {
        dt = d.Key.ToString("dd/MM/yyyy"),
        count = d.Count(),
        // if you need that persons collection should be a list, then call .ToList() after Select()
        persons = d.Select(t => t)
    });
    

    来自Date的{​​{1}}属性截断时间,因此如果在访问Date属性时有DateTime,则Date等于new DateTime(2015,1,1,12,30,59),所以

    new DateTime(2015,1,1)

    是真的

答案 2 :(得分:0)

您可以调用ToList方法将每组PersonneWithDate作为列表:

    //...
    select new { dt = string.Format("{0}/{1}/{2}",d.Key.day,d.Key.month,d.Key.year),
                 count = d.Count(),
                 persons=d.ToList()
               };