C# LINQ将基于标志向JSON添加连续记录

C# LINQ将基于标志向JSON添加连续记录,c#,json,linq,.net-core,C#,Json,Linq,.net Core,我有一个实体有一套记录 public class Employee { public int EmpID { get; set; } public DateTime EntryTime { get; set; } public DateTime ExitTime { get; set; } public bool CheckFlag { get; set; } } var employees = new List<Employee>(); em

我有一个实体有一套记录

public class Employee
{
    public int EmpID { get; set; }
    public DateTime EntryTime { get; set; }
    public DateTime ExitTime { get; set; }
    public bool CheckFlag { get; set; }
}   

var employees = new List<Employee>();
employees.Add(new Employee() { EmpID = 1, EntryTime = new DateTime(2020, 02, 16, 1, 0, 0), ExitTime = new DateTime(2020, 02, 16, 2, 15, 0), CheckFlag = true });
employees.Add(new Employee() { EmpID = 2, EntryTime = new DateTime(2020, 02, 16, 4, 50, 0), ExitTime = new DateTime(2020, 02, 16, 5, 15, 0), CheckFlag = false });
employees.Add(new Employee() { EmpID = 1, EntryTime = new DateTime(2020, 02, 16, 3, 35, 0), ExitTime = new DateTime(2020, 02, 16, 3, 45, 0), CheckFlag = false });
employees.Add(new Employee() { EmpID = 1, EntryTime = new DateTime(2020, 02, 16, 3, 20, 0), ExitTime = new DateTime(2020, 02, 16, 3, 30, 0), CheckFlag = false });
employees.Add(new Employee() { EmpID = 2, EntryTime = new DateTime(2020, 02, 16, 3, 30, 0), ExitTime = new DateTime(2020, 02, 16, 4, 45, 0), CheckFlag = false });
employees.Add(new Employee() { EmpID = 2, EntryTime = new DateTime(2020, 02, 16, 2, 30, 0), ExitTime = new DateTime(2020, 02, 16, 3, 15, 0), CheckFlag = true });
employees.Add(new Employee() { EmpID = 2, EntryTime = new DateTime(2020, 02, 16, 1, 45, 0), ExitTime = new DateTime(2020, 02, 16, 2, 15, 0), CheckFlag = false });
我尝试的(foreach group by和order by)

公共类跟踪记录
{
公共int EmpID{get;set;}
公共列表轨迹时间{get;set;}
}
公共类轨道时间
{
公共日期时间开始时间{get;set;}
公共日期时间结束时间{get;set;}
}
var trackRecord=新列表();
var trackTimes=新列表();
bool checkflag=true;
int-prevEmpId=0;
foreach(var结果为employees.GroupBy(x=>x.EmpID))
{
如果(!checkflag&&trackTimes.Count>0)
{
添加(新的trackRecord()
{
EmpID=前EmpID,
轨道时间=轨道时间
});
checkflag=true;
trackTimes=新列表();
}
foreach(result.OrderBy中的var employee(x=>x.EntryTime))
{
if(employee.CheckFlag)
{
如果(!checkflag&&trackTimes.Count>0)
{
添加(新的trackRecord()
{
EmpID=employee.EmpID,
轨道时间=轨道时间
});
checkflag=true;
trackTimes=新列表();
}
添加(新的trackRecord()
{
EmpID=employee.EmpID,
TrackTimes=new List(){new TrackTime(){StartTime=employee.EntryTime,EndTime=employee.ExitTime}
});                        
}
其他的
{
Add(new TrackTime(){StartTime=employee.EntryTime,EndTime=employee.ExitTime});
checkflag=false;
}
}
prevEmpId=result.Key;
}
如果(!checkflag&&trackTimes.Count>0)
{
添加(新的trackRecord()
{
EmpID=前EmpID,
轨道时间=轨道时间
});
checkflag=true;
trackTimes=新列表();
}
WriteLine(JsonConvert.SerializeObject(trackRecord));

为了方便起见,让我们将
员工的
日期时间
属性移动到已定义的
跟踪时间
类中,如下所示:

public class Employee
{
    public int EmpID { get; set; }
    public TrackTime TrackTime { get; set; }
    public bool CheckFlag { get; set; }
} 
那么你的Linq应该是:

var records = employees
  .GroupBy(e => new { e.EmpID, e.CheckFlag })
  .SelectMany(g =>
     g.Key.CheckFlag ?
     g.Select(e => new List<Employee> { e }).ToList() :
     new List<List<Employee>> { g.ToList() })
  .Select(es => new TrackRecord
  {
      EmpID = es.First().EmpID,
      TrackTimes = es.Select(e => e.TrackTime).ToList()
  })
  .OrderBy(e => e.EmpID)
  .ThenBy(e => e.TrackTimes.First().EntryTime)
  .ToList();

如果按
CheckFlag
分组,则将有两个组,分别为
true
false
。您有两个
CheckFlag
等于
true
的项。您是如何获得单个结果的?请分享您的
foreach
循环代码,以及您是如何获得预期结果的result@PavelAnikhouski,添加了foreach代码。您是按
EmpID
对项目进行分组,而不是按
CheckFlag
property@KrishnaMuppalla,当存在两个不同的
EmpId
s时,是否可以添加预期输出,例如,使用值1和2?
public class Employee
{
    public int EmpID { get; set; }
    public TrackTime TrackTime { get; set; }
    public bool CheckFlag { get; set; }
} 
var records = employees
  .GroupBy(e => new { e.EmpID, e.CheckFlag })
  .SelectMany(g =>
     g.Key.CheckFlag ?
     g.Select(e => new List<Employee> { e }).ToList() :
     new List<List<Employee>> { g.ToList() })
  .Select(es => new TrackRecord
  {
      EmpID = es.First().EmpID,
      TrackTimes = es.Select(e => e.TrackTime).ToList()
  })
  .OrderBy(e => e.EmpID)
  .ThenBy(e => e.TrackTimes.First().EntryTime)
  .ToList();
var employees = new List<Employee>();
employees.Add(new Employee() { EmpID = 1, TrackTime = new TrackTime { EntryTime = new DateTime(2020, 02, 16, 1, 0, 0), ExitTime = new DateTime(2020, 02, 16, 2, 15, 0) }, CheckFlag = true });
employees.Add(new Employee() { EmpID = 1, TrackTime = new TrackTime { EntryTime = new DateTime(2020, 02, 16, 3, 15, 0), ExitTime = new DateTime(2020, 02, 16, 3, 30, 0) }, CheckFlag = false });
employees.Add(new Employee() { EmpID = 1, TrackTime = new TrackTime { EntryTime = new DateTime(2020, 02, 16, 3, 30, 0), ExitTime = new DateTime(2020, 02, 16, 3, 45, 0) }, CheckFlag = false });
employees.Add(new Employee() { EmpID = 1, TrackTime = new TrackTime { EntryTime = new DateTime(2020, 02, 16, 3, 45, 0), ExitTime = new DateTime(2020, 02, 16, 4, 15, 0) }, CheckFlag = false });
employees.Add(new Employee() { EmpID = 1, TrackTime = new TrackTime { EntryTime = new DateTime(2020, 02, 16, 4, 30, 0), ExitTime = new DateTime(2020, 02, 16, 5, 15, 0) }, CheckFlag = true });
employees.Add(new Employee() { EmpID = 2, TrackTime = new TrackTime { EntryTime = new DateTime(2020, 02, 16, 1, 0, 0), ExitTime = new DateTime(2020, 02, 16, 2, 15, 0) }, CheckFlag = true });
employees.Add(new Employee() { EmpID = 2, TrackTime = new TrackTime { EntryTime = new DateTime(2020, 02, 16, 3, 15, 0), ExitTime = new DateTime(2020, 02, 16, 3, 30, 0) }, CheckFlag = false });
employees.Add(new Employee() { EmpID = 2, TrackTime = new TrackTime { EntryTime = new DateTime(2020, 02, 16, 3, 30, 0), ExitTime = new DateTime(2020, 02, 16, 3, 45, 0) }, CheckFlag = false });
employees.Add(new Employee() { EmpID = 2, TrackTime = new TrackTime { EntryTime = new DateTime(2020, 02, 16, 3, 45, 0), ExitTime = new DateTime(2020, 02, 16, 4, 15, 0) }, CheckFlag = false });
employees.Add(new Employee() { EmpID = 2, TrackTime = new TrackTime { EntryTime = new DateTime(2020, 02, 16, 4, 30, 0), ExitTime = new DateTime(2020, 02, 16, 5, 15, 0) }, CheckFlag = true });
[
  {
    "EmpID  ": 1,
    "TrackTimes  ": [
      {
        "EntryTime  ": "2020-02-16T01:00:00  ",
        "ExitTime  ": "2020-02-16T02:15:00  "
      }
    ]
  },
  {
    "EmpID  ": 1,
    "TrackTimes  ": [
      {
        "EntryTime  ": "2020-02-16T03:15:00  ",
        "ExitTime  ": "2020-02-16T03:30:00  "
      },
      {
        "EntryTime  ": "2020-02-16T03:30:00  ",
        "ExitTime  ": "2020-02-16T03:45:00  "
      },
      {
        "EntryTime  ": "2020-02-16T03:45:00  ",
        "ExitTime  ": "2020-02-16T04:15:00  "
      }
    ]
  },
  {
    "EmpID  ": 1,
    "TrackTimes  ": [
      {
        "EntryTime  ": "2020-02-16T04:30:00  ",
        "ExitTime  ": "2020-02-16T05:15:00  "
      }
    ]
  },
  {
    "EmpID  ": 2,
    "TrackTimes  ": [
      {
        "EntryTime  ": "2020-02-16T01:00:00  ",
        "ExitTime  ": "2020-02-16T02:15:00  "
      }
    ]
  },
  {
    "EmpID  ": 2,
    "TrackTimes  ": [
      {
        "EntryTime  ": "2020-02-16T03:15:00  ",
        "ExitTime  ": "2020-02-16T03:30:00  "
      },
      {
        "EntryTime  ": "2020-02-16T03:30:00  ",
        "ExitTime  ": "2020-02-16T03:45:00  "
      },
      {
        "EntryTime  ": "2020-02-16T03:45:00  ",
        "ExitTime  ": "2020-02-16T04:15:00  "
      }
    ]
  },
  {
    "EmpID  ": 2,
    "TrackTimes  ": [
      {
        "EntryTime  ": "2020-02-16T04:30:00  ",
        "ExitTime  ": "2020-02-16T05:15:00  "
      }
    ]
  }
]