LINQ 分组(按选择与集合)

本文关键字:集合 选择 分组 LINQ | 更新日期: 2023-09-27 18:35:24

我有一个数据表,例如

ID  Agent  Date
1   A1    2016-02-19
2   A1    2016-02-20
3   A2    2016-02-19
4   A3    2016-02-20

我想按日期对这些记录进行分组,并返回 ID 和代理列表,如下所示:

Date:2016-02-19 ,{(1,A1),(3,A2)}
Date:2016-02-20 ,{(2,A1),(4,A3)}

ID 和代理按日期分组的集合对象。请了解如何使用 LINQ 实现它。

LINQ 分组(按选择与集合)

我认为像下面这样的东西可以做到你想要的。

var result = datatable.AsEnumerable()
                      .GroupBy(row=>row.Field<DateTime>("Date"))
                      .Select(gr=>new 
                      {
                          Date = gr.Key,
                          Agents = gr.Select(x => new 
                          {
                              Id = x.Field<int>("ID"),
                              Agent = x.Field<string>("Agent")
                          })
                      });

更新

如果您需要每个日期的代理以逗号分隔的代理列表,像这个{(2,A1),(4,A3)},你可以尝试以下方法。

var result = datatable.AsEnumerable()
                          .GroupBy(row=>row.Field<DateTime>("Date"))
                          .Select(gr=>new 
                          {
                              Date = gr.Key,
                              Agents = "{"+ string.Join(",", 
                                       gr.Select(x => new 
                              string.Format("({0},{1})", 
                                  x.Field<int>("ID"), 
                                  x.Field<string>("Agent"))+"}"
                              })
                          });
这是我

的示例类:

public class Log
{
    public int ID { get; set; }
    public string Agent { get; set; }
    public DateTime Date { get; set; }
    public Log(int id, string agent, DateTime date)
    {
        ID = id;
        Agent = agent;
        Date = date;
    }
}

下面是带有一些测试数据的 LINQ 语句:

List<Log> list = new List<Log>()
{
    new Log(1, "A", new DateTime(2016, 01, 01, 0, 0, 0)),
    new Log(2, "B", new DateTime(2016, 01, 01, 0, 0, 0)),
    new Log(3, "C", new DateTime(2016, 01, 01, 0, 0, 0)),
    new Log(4, "A", new DateTime(2016, 01, 02, 0, 0, 0)),
    new Log(5, "A", new DateTime(2016, 01, 03, 0, 0, 0))
};
var result = from entry in list
             group entry by entry.Date
             into g
             select g;

这会将您的所有数据分组到具有基于 Log.Date的组中,其中每个组由多个条目组成,每个条目都有一个IDAgentDate属性。

这里有一些如何访问result的示例代码:

result.ToList().ForEach(group =>
{
    Console.WriteLine(group.Key); // The date
    group.ToList().ForEach(entry => Console.WriteLine(entry.ID + " - " + entry.Agent)); // Print out each entry per group
});