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 "
}
]
}
]