C# 从日期时间列表c中排除日期列表
我一直试图从日期时间列表中排除日期列表,情况是C# 从日期时间列表c中排除日期列表,c#,list,datetime,C#,List,Datetime,我一直试图从日期时间列表中排除日期列表,情况是 //LATES APPROVED LIST var lateReq = (from mk in db.Late where mk.EmpID == EmployeeRec.EmpId && mk.TeamLeadAppr == 1 && mk.DeptLeadAppr == 1 select mk).ToList(); List<DateTime> latesApproved = new Li
//LATES APPROVED LIST
var lateReq = (from mk in db.Late
where mk.EmpID == EmployeeRec.EmpId
&& mk.TeamLeadAppr == 1 && mk.DeptLeadAppr == 1
select mk).ToList();
List<DateTime> latesApproved = new List<DateTime>();
List<LateRequest> lateRequest = new List<LateRequest>();
foreach (var gk in lateReq)
{
latesApproved.Add(gk.lateDate.Value);
}
//here lets say there is a date in latesApproved i.e. 13/3/2018 12:00:00 AM
//now in the `lateComings` list there are datetimes i.e. 13/3/2018 10:26:35 AM
//exclude the lates approved list from the lateComings list
List<DateTime> LateComingList = lateComings.ToList();
//我需要与datetime的最终清单,因为我有进一步的工作与清单的时间部分如下
//list of time differences
var timeDiff = new List<TimeSpan>();
foreach (DateTime ts in lateComings)
{
if (ts.TimeOfDay > AT)//TimeSpan.FromHours(AT)
{
timeDiff.Add(ts.TimeOfDay - AT);//TimeSpan.FromHours(AT));
}
}
countLates = lateComings.Count();
//fetching the minutes from the above list which is in the format of 02:43:00
var minutesList = timeDiff.Select(t => Convert.ToInt32(t.TotalMinutes)).ToList();
对于水晶图片
最新核准名单
2018年3月1日12:00:00:AM
2018年3月5日12:00:00:AM
2018年3月9日12:00:00:AM
2018年3月13日12:00:00:AM
迟到名单
2018年3月5日11:00:32:AM
2018年3月6日10:54:33:AM
2018年3月7日08:34:47:AM
2018年3月8日12:30:40:AM
2018年3月9日10:03:00:AM
2018年3月10日11:03:00:AM
2018年3月11日11:30:40:AM
2018年3月12日10:30:40:AM
2018年3月13日08:30:00:AM
一些最终列表应该如下所示:
2018年3月6日10:54:33:AM
2018年3月7日08:34:47:AM
2018年3月8日12:30:40:AM
2018年3月10日11:03:00:AM
2018年3月11日11:30:40:AM
2018年3月12日10:30:40:AM这里的问题是,当您运行Except时,它会查看实际日期时间值,并考虑时间,因此它不会与其他任何内容匹配。您需要使用重载,该重载需要一个相等比较器,以确保它们在日期级别得到相同的处理。考虑以下事项:
// class Program : IEqualityComparer<DateTime> // place something like this at the class definition.
bool IEqualityComparer<DateTime>.Equals(DateTime x, DateTime y)
{
return x.Date == y.Date; // Compare the dates and not the times.
}
int IEqualityComparer<DateTime>.GetHashcode(DateTime obj)
{
return obj.Date.GetHashCode();
}
您需要将其替换为您使用的类的实例
更新
为了使其工作,您的一个类通常是需要进行比较的类,您必须实现该接口。假设您的类名为LateArrivalController,这就是更改定义的方式
public class LateArrivalController : Controller, IEqualityComparer<DateTime>
这看起来像是为我做的工作:
List<DateTime> latesApproved = new List<DateTime>
{
Convert.ToDateTime("01/03/2018 12:00:00"),
Convert.ToDateTime("05/03/2018 12:00:00"),
Convert.ToDateTime("09/03/2018 12:00:00"),
Convert.ToDateTime("13/03/2018 12:00:00")
};
List<DateTime> lateComings = new List<DateTime>
{
Convert.ToDateTime("05/03/2018 11:00:32"),
Convert.ToDateTime("06/03/2018 10:54:33"),
Convert.ToDateTime("07/03/2018 08:34:47"),
Convert.ToDateTime("08/03/2018 12:30:40"),
Convert.ToDateTime("09/03/2018 10:03:00"),
Convert.ToDateTime("10/03/2018 11:03:00"),
Convert.ToDateTime("11/03/2018 11:30:40"),
Convert.ToDateTime("12/03/2018 10:30:40"),
Convert.ToDateTime("13/03/2018 08:30:00")
};
List<DateTime> dateTimes = lateComings
.Where(x => !latesApproved
.Select(a => a.Date)
.Contains(x.Date))
.ToList();
你只是想从迟到名单中找到所有不在批准名单中的人吗?我不清楚,你到底有什么问题。看起来你有一个从DateTime中删减时间的解决方案,我认为这应该可以解决这个问题。为什么不起作用?还有什么问题?在时间位处理中,您真的需要进行这些差异计算吗?您不能在代码中只使用DateTime字段的日期部分吗?在我看来,不管怎样,你只是减少了小时部分。事实上,我想要所有的约会时间,除了在latesApproved@CsabaBenko修剪时间部分解决了问题,但我不想修剪它,因为我需要在代码的下一部分中使用它。我添加了与您的测试数据@Mickjohn'StatController.IEqualityComparer.EqualsDateTime一起工作的代码,DateTime”:包含类型未实现接口“IEqualityComparer”错误CS0540“StatsController.GetHashcodeDateTime”:包含类型未实现接口“IEqualityComparer”错误CS0539“StatsController.GetHashcodeDateTime”显式接口声明中的接口“IEqualityComparer”不是接口的成员。您发布时,我正在编辑答案这将包括关于此的说明。看一看。我正在使用asp.NETMVC
public class LateArrivalController : Controller, IEqualityComparer<DateTime>
var lateComingsWithoutApproved = LateComingList.Except(latesApproved, this).ToList();
List<DateTime> latesApproved = new List<DateTime>
{
Convert.ToDateTime("01/03/2018 12:00:00"),
Convert.ToDateTime("05/03/2018 12:00:00"),
Convert.ToDateTime("09/03/2018 12:00:00"),
Convert.ToDateTime("13/03/2018 12:00:00")
};
List<DateTime> lateComings = new List<DateTime>
{
Convert.ToDateTime("05/03/2018 11:00:32"),
Convert.ToDateTime("06/03/2018 10:54:33"),
Convert.ToDateTime("07/03/2018 08:34:47"),
Convert.ToDateTime("08/03/2018 12:30:40"),
Convert.ToDateTime("09/03/2018 10:03:00"),
Convert.ToDateTime("10/03/2018 11:03:00"),
Convert.ToDateTime("11/03/2018 11:30:40"),
Convert.ToDateTime("12/03/2018 10:30:40"),
Convert.ToDateTime("13/03/2018 08:30:00")
};
List<DateTime> dateTimes = lateComings
.Where(x => !latesApproved
.Select(a => a.Date)
.Contains(x.Date))
.ToList();