从集合中查找缺少的日期

时间:2010-12-09 21:40:54

标签: c# recursion

我的日期数组的值如下: “07/07/2011”,“08/05/2011”,“09/07/2011”,“12/07/2011”

在我的C#程序中使用它作为输入,我需要构建一个缺少日期的新集合。 2011年10月10日,11/07/2011。

递归是实现这一目标的最佳方法吗?

感谢。

3 个答案:

答案 0 :(得分:4)

完全没有。这应该是一个简单的过程。你有一个开始日期,你有一个间隔...你开始走数组,如果下一个值不匹配你以前的值加上你在新数组中插入一个新值的间隔。如果匹配,则复制该值。

如果您需要有关每个条目的更多数据(元数据),那么创建一个包含日期和您认为有用的元数据的类(例如像this_value_was_inserted_artificially一样的bool)

使用递归会不必要地使事情变得复杂。

答案 1 :(得分:4)

不需要递归。这可能是优化的,但应该做的工作:

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

答案 2 :(得分:1)

你可以用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);