C#-在集合中填写空日期
假设类Data定义为{DateTime TransactionDate,int ItemCount}。 我得到了一个原始IEnumerable,其中包含分散的TransactionDate和ItemCounts,我需要编写一个方法,返回一个集合,其中所有的天数都在原始集合的最小和最大天数之间 例如,如果我得到: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
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而不是一天)。