C# 配对并计算支票类型的小时数
,我有一个名为C# 配对并计算支票类型的小时数,c#,sql-server,asp.net-mvc,C#,Sql Server,Asp.net Mvc,,我有一个名为Attendancelogs的表,其中包含所有已排序的日志检查类型In和Out。(多亏了@StephenMuecke,前面的问题基本解决了)然而,我下一步要做的是将特定时期(StartDate和EndDate)的所有输入和输出列成一对,然后计算员工的总小时数 我有两种方法,一种叫做getSingleDevicePairs(int EnrollNumber,DateTime StartDate,DateTime EndDate),它创建pairList,另一种叫做getTimesP
Attendancelogs
的表,其中包含所有已排序的日志检查类型In
和Out
。(多亏了@StephenMuecke,前面的问题基本解决了)然而,我下一步要做的是将特定时期(StartDate
和EndDate
)的所有输入和输出列成一对,然后计算员工的总小时数
我有两种方法,一种叫做getSingleDevicePairs(int EnrollNumber,DateTime StartDate,DateTime EndDate)
,它创建pairList
,另一种叫做getTimesPentachDay(List pairList)
,它计算每天的总小时数
结对
public class Pair {
public int id { get; set; }
public int RegisterationId { get; set; }
public int EmpID { get; set; }
public DateTime InnDateTime { get; set; }
public DateTime OutDateTime { get; set; }
}
public List<Pair> getSingleDevicePairs(int EnrollNumber, DateTime StartDate, DateTime EndDate) {
DateTime today = DateTime.Now;
List<Pair> pairList = new List<Pair>();
var logs = db.AttendanceLogs.Where(x => x.RegisterationId == EnrollNumber && x.Date >= StartDate &&
x.Date <= EndDate && x.isIgnore != true && (x.CheckType == "In" || x.CheckType == "Out")).Distinct().ToList();
int loopEnd = 0;
bool oddLogs = false;
if (logs.Count % 2 == 0) {
loopEnd = logs.Count;
} else {
loopEnd = logs.Count - 1;
oddLogs = true;
}
bool inn = true;
if (loopEnd > 1) {
Pair pair = new Pair();
for (int v = 0; v < loopEnd; v++) {
if (inn) {
pair.InnDateTime = logs[v].DateTime;
inn = false;
} else {
pair.OutDateTime = logs[v].DateTime;
inn = true;
pairList.Add(pair);
pair = new Pair();
}
}
}
Bogus bogus = new Bogus();
DateTime bogusDate = new DateTime();
if (oddLogs) {
bogus.MachineNum = logs[logs.Count - 1].DeviceID;
bogus.RegisterationId = logs[logs.Count - 1].RegisterationId;
bogus.DateTime = logs[logs.Count - 1].DateTime;
bogusDate = logs[logs.Count - 1].DateTime;
}
return pairList;
}
^这种方法在案例1中再次失败,因为它在pairList中依次添加In
和Out
public List<DateAndTime> getTimeSpentEachDay(List<Pair> pairList) {
List<DateAndTime> list = new List<DateAndTime>();
if (pairList.Count > 0) {
for (int i = 0; i < pairList.Count; i++) {
TimeSpan span = TimeSpan.Zero;
// bool flag = false;
int result = -1;
do {
span = span + (pairList[i].OutDateTime - pairList[i].InnDateTime);
result = -1;
if (i < pairList.Count - 1) {
DateTime p = (DateTime)pairList[i].InnDateTime;
DateTime q = (DateTime)pairList[i + 1].InnDateTime;
result = DateTime.Compare(p.Date, q.Date);
}
if (result == 0) {
i++;
// flag = true;
}
} while (result == 0);
//if (i == pairList.Count - 1)
//{
// span = span + (pairList[i].OutDateTime - pairList[i].InnDateTime) ?? TimeSpan.Zero;
//}
DateAndTime dnt = new DateAndTime();
dnt.date = ((DateTime)pairList[i].InnDateTime).ToString("yyyy-MM-dd");
dnt.Time = span;
list.Add(dnt);
}
}
return list.ToList();
}
public List getTimeSpentEachDay(List pairList){
列表=新列表();
如果(pairList.Count>0){
for(int i=0;i
我试图得到每一对的总小时数,以及一种将
中的奇数
一起显示在日历上的方法
下面是一个员工日历视图的图像,该视图仅显示成对的小时数,我甚至想在中显示一个,表示该员工忘记退房或缺少一个条目
*假设他在4月9日晚上8:00左右办理了一次入住手续,但当天没有退房,而且是在夜间限制时间(上午12点-上午7点),那么日历上应该会显示一行,只有在我从以前的方法中拿出一天的假记录时才会出现
getTimeSpentEachDay()没有什么问题代码>只需在getSingleDevicePairs()中做一些小更改
method,第一种方法失败,因为它在奇数情况下消除了日志的最后一个条目;第二种方法失败,因为它没有考虑日志存储在表中的顺序
public List<Pair> getSingleDevicePairs(int EnrollNumber, DateTime StartDate, DateTime EndDate, int? missingEntry)
{
var logs = db.AttendanceLogs.Where(x => x.RegisterationId == EnrollNumber &&
x.Date >= StartDate && x.Date <= EndDate && x.isIgnore != true
&& (x.CheckType == "In" || x.CheckType == "Out")).Distinct().ToList();
if (logs.Count > 0)
{
bool isCheck = false;
Pair pair = new Pair();
DateTime previous = logs.FirstOrDefault().DateTime;
foreach (var log in logs)
{
if (!isCheck)
{
if (log.CheckType == "In")
{
pair.InnDateTime = log.DateTime;
isCheck = true;
}
}
else
{
if (log.CheckType == "Out")
{
pair.OutDateTime = log.DateTime;
isCheck = false;
pairList.Add(pair);
pair = new Pair();
}
if (pair.OutDateTime == DateTime.MinValue)
{
pair.InnDateTime = log.DateTime;
}
}
}
}
return pairList;
}
public List getSingleDevicePairs(int-EnrollNumber、DateTime-StartDate、DateTime-EndDate、int-missingEntry)
{
var logs=db.AttendanceLogs.Where(x=>x.RegisterationId==EnrollNumber&&
x、 日期>=开始日期和x日期(0)
{
bool-isCheck=false;
Pair Pair=新的Pair();
DateTime previous=logs.FirstOrDefault().DateTime;
foreach(var登录日志)
{
如果(!isCheck)
{
如果(log.CheckType==“In”)
{
pair.InnDateTime=log.DateTime;
isCheck=true;
}
}
其他的
{
如果(log.CheckType==“Out”)
{
pair.OutDateTime=log.DateTime;
isCheck=false;
pairList.Add(成对);
pair=新的pair();
}
if(pair.OutDateTime==DateTime.MinValue)
{
pair.InnDateTime=log.DateTime;
}
}
}
}
返回成对列表;
}
只有当输入的存在输出时,这才完成配对
public List<Pair> getSingleDevicePairs(int EnrollNumber, DateTime StartDate, DateTime EndDate, int? missingEntry)
{
var logs = db.AttendanceLogs.Where(x => x.RegisterationId == EnrollNumber &&
x.Date >= StartDate && x.Date <= EndDate && x.isIgnore != true
&& (x.CheckType == "In" || x.CheckType == "Out")).Distinct().ToList();
if (logs.Count > 0)
{
bool isCheck = false;
Pair pair = new Pair();
DateTime previous = logs.FirstOrDefault().DateTime;
foreach (var log in logs)
{
if (!isCheck)
{
if (log.CheckType == "In")
{
pair.InnDateTime = log.DateTime;
isCheck = true;
}
}
else
{
if (log.CheckType == "Out")
{
pair.OutDateTime = log.DateTime;
isCheck = false;
pairList.Add(pair);
pair = new Pair();
}
if (pair.OutDateTime == DateTime.MinValue)
{
pair.InnDateTime = log.DateTime;
}
}
}
}
return pairList;
}