C# 从集合中查找缺少的日期
我已使用以下值创建了日期数组: 2011年7月7日、2011年5月8日、2011年7月9日、2011年7月12日 在我的C程序中使用这个作为输入,我需要构建一个新的集合,它将丢失日期。2011年7月10日,2011年7月11日 递归是实现这一点的最佳方法吗C# 从集合中查找缺少的日期,c#,recursion,C#,Recursion,我已使用以下值创建了日期数组: 2011年7月7日、2011年5月8日、2011年7月9日、2011年7月12日 在我的C程序中使用这个作为输入,我需要构建一个新的集合,它将丢失日期。2011年7月10日,2011年7月11日 递归是实现这一点的最佳方法吗 谢谢。一点也不。这应该是一个简单的过程。你有一个开始日期,你有一个间隔。。。开始遍历数组,如果下一个值与上一个值加上间隔不匹配,则向新数组中插入一个新值。如果匹配,则复制该值 如果您需要关于每个条目的更多数据元数据,那么创建一个类来保存日期和
谢谢。一点也不。这应该是一个简单的过程。你有一个开始日期,你有一个间隔。。。开始遍历数组,如果下一个值与上一个值加上间隔不匹配,则向新数组中插入一个新值。如果匹配,则复制该值 如果您需要关于每个条目的更多数据元数据,那么创建一个类来保存日期和您认为有用的任何元数据,例如,像这样的布尔值是人工插入的
使用递归将不必要地使事情复杂化。不需要递归。这可能是可以优化的,但应该做到:
public static IEnumerable<DateTime> FindMissingDates(IEnumerable<DateTime> input)
{
// get the range of dates to check
DateTime from = input.Min();
DateTime to = input.Max();
// how many days?
int numberOfDays = to.Subtract(from).Days;
// create an IEnumerable<DateTime> for all dates in the range
IEnumerable<DateTime> allDates = Enumerable.Range(0, numberOfDays)
.Select(n => from.AddDays(n));
// return all dates, except those found in the input
return allDates.Except(input);
}
您可以通过Linq很好地实现这一点:
var dates=new[]{
DateTime.Parse("07/07/2011"),
DateTime.Parse("08/07/2011"),
DateTime.Parse("09/07/2011"),
DateTime.Parse("12/07/2011")};
var days=(dates.Max()-dates.Min()).Days;
var otherDays=
Enumerable
.Range(0,days)
.Select(d=>dates.Min().AddDays(d))
.Except(dates);
递归通常不是答案。但是关于这个问题,2011年5月8日应该是2011年7月8日吗?2.隐含模式是实际模式吗?例如,您提供的日期和缺少的日期有每月一次的间隔?有关想法,请参阅这些问题。您是将其存储为字符串还是日期时间?这是一个很好的问题。我可能会将此作为面试问题。这是MDY还是DMY。不管怎样,我对2011年5月8日的条目感到有点困惑。不过,看起来OP是在寻找一个月的间隔。@Dan Tao:那将取决于你是否是美国人。没关系,我忘了我在美国,我们把日期写反了;