C#-在集合中填写空日期

C#-在集合中填写空日期,c#,C#,假设类Data定义为{DateTime TransactionDate,int ItemCount}。 我得到了一个原始IEnumerable,其中包含分散的TransactionDate和ItemCounts,我需要编写一个方法,返回一个集合,其中所有的天数都在原始集合的最小和最大天数之间 例如,如果我得到: 12/5/2009 15.00 12/7/2009 10.00 12/10/2009 75.00 我需要生成如下内容: 12/5/2009 15.00 12/6/2009 0.00 12

假设类Data定义为{DateTime TransactionDate,int ItemCount}。 我得到了一个原始IEnumerable,其中包含分散的TransactionDate和ItemCounts,我需要编写一个方法,返回一个集合,其中所有的天数都在原始集合的最小和最大天数之间

例如,如果我得到:
12/5/2009 15.00
12/7/2009 10.00
12/10/2009 75.00

我需要生成如下内容:
12/5/2009 15.00
12/6/2009 0.00
12/7/2009 10.00
2009年12月8日0.00
2009年9月12日0.00
12/10/2009 75.00

你能给我一个用c#3.0做这件事的优雅方法吗

我有一个最小日期和最大日期之间所有日期的列表。所以我假设我所要做的就是“foreach”intersect集合(allDates existingDates)并为每个集合插入一个新元素。我说得对吗


感谢

从第一个日期开始使用,并在从第一个日期循环到最后一个日期时填空?

从第一个日期开始使用,并在从第一个日期循环到最后一个日期时填空?

假设您的收藏是一本词典(日期是唯一的,可以用作键),您可以这样做:

-一,。确定源集合中的第一个和最后一个日期(如果集合是sortedDictionary,则有first和last元素)

-二,。创建一个IEnumerator,它可以迭代给定开始日期和结束日期之间的所有日期

-三,。使用foreach结构,使用枚举数和收集的开始和结束日期。在每一步中,检查当前日期是否是源列表中的键,在这种情况下,您可以将其复制到结果列表中,否则将创建一个新的结果项,该结果项具有当前日期,项计数为0

让我知道这个概念证明对你来说是足够的,如果不是,我会尝试建立一个例子


编辑:您编辑了问题,提到您已经有了开始和结束之间所有日期的列表,因此您可以跳过第二步。:)

假设您的收藏是一本字典(日期是唯一的,可以用作键),您可以这样做:

-一,。确定源集合中的第一个和最后一个日期(如果集合是sortedDictionary,则有first和last元素)

-二,。创建一个IEnumerator,它可以迭代给定开始日期和结束日期之间的所有日期

-三,。使用foreach结构,使用枚举数和收集的开始和结束日期。在每一步中,检查当前日期是否是源列表中的键,在这种情况下,您可以将其复制到结果列表中,否则将创建一个新的结果项,该结果项具有当前日期,项计数为0

让我知道这个概念证明对你来说是足够的,如果不是,我会尝试建立一个例子


编辑:您编辑了问题,提到您已经有了开始和结束之间所有日期的列表,因此您可以跳过第二步。:)

这里有一个扩展方法可以完成这项工作。它完全基于迭代器(
IEnumerable
),所以对我来说这似乎是一个不错的方法

public static IEnumerable<Data> FillIn(this IEnumerable<Data> original)
{
    Data lastItem = null;
    foreach (var item in original)
    {
        if (lastItem != null)
        {
            var fakeItem = new DateTime(lastItem.TransactionDate.Year,
                lastItem.TransactionDate.Month, lastItem.TransactionDate.Day)
                .AddDays(1);
            while (fakeItem.TransactionDate != item.TransactionDate)
            {
                yield return fakeItem;
                fakeItem.TransactionDate = fakeItem.TransactionDate.AddDays(1);
            }
        }
        lastItem = item;
        yield return item;
    }
}

这里有一个扩展方法可以完成这项工作。它完全基于迭代器(
IEnumerable
),所以对我来说这似乎是一个不错的方法

public static IEnumerable<Data> FillIn(this IEnumerable<Data> original)
{
    Data lastItem = null;
    foreach (var item in original)
    {
        if (lastItem != null)
        {
            var fakeItem = new DateTime(lastItem.TransactionDate.Year,
                lastItem.TransactionDate.Month, lastItem.TransactionDate.Day)
                .AddDays(1);
            while (fakeItem.TransactionDate != item.TransactionDate)
            {
                yield return fakeItem;
                fakeItem.TransactionDate = fakeItem.TransactionDate.AddDays(1);
            }
        }
        lastItem = item;
        yield return item;
    }
}

假设您有一个名为alldates的列表,其中包含从最小日期到最大日期范围内的所有日期,您可以执行以下操作:

var transactions = new List<Data>(originalData);
transactions.AddRange(from dt in
                      alldates.Except
                          (
                          from t in transactions
                          select t.TransactionDate
                          )
                  select new Data() { TransactionDate = dt, ItemCount = 0 });

假设您有一个名为alldates的列表,其中包含从最小日期到最大日期范围内的所有日期,您可以执行以下操作:

var transactions = new List<Data>(originalData);
transactions.AddRange(from dt in
                      alldates.Except
                          (
                          from t in transactions
                          select t.TransactionDate
                          )
                  select new Data() { TransactionDate = dt, ItemCount = 0 });

你应该考虑Addid工作浮动的事实。由于这个原因,我发现它有时不准确(即增加23 H59MXXs,而不是一天)。出于这个原因,我发现它有时并不准确(即添加23H59MXX而不是一天)。