C# 从集合中查找缺少的日期

C# 从集合中查找缺少的日期,c#,recursion,C#,Recursion,我已使用以下值创建了日期数组: 2011年7月7日、2011年5月8日、2011年7月9日、2011年7月12日 在我的C程序中使用这个作为输入,我需要构建一个新的集合,它将丢失日期。2011年7月10日,2011年7月11日 递归是实现这一点的最佳方法吗 谢谢。一点也不。这应该是一个简单的过程。你有一个开始日期,你有一个间隔。。。开始遍历数组,如果下一个值与上一个值加上间隔不匹配,则向新数组中插入一个新值。如果匹配,则复制该值 如果您需要关于每个条目的更多数据元数据,那么创建一个类来保存日期和

我已使用以下值创建了日期数组: 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:那将取决于你是否是美国人。没关系,我忘了我在美国,我们把日期写反了;