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;
        }