我有一套Items,每个都有Start和End
class Item
{
int Value { get; }
DateTimeOffset Start { get; }
DateTimeOffset End { get; }
}例如:
因此,有两个不重叠的间隔。值1覆盖整个2019年,值2覆盖整个2020年。
但突然间,我意识到我忘记了其中的一个价值。
所以我想用我忘记的值做某种“导入”操作。
其结果应是:
如您所见,3值被插入并与现有值协调。应该“合并”,修改现有的间隔,使它们都不重叠。
我不知道如何进行这种生成结果项的“导入”。
发布于 2019-09-24 17:57:23
创建一个扩展方法。我想这个列表是按开始日期排序的。
public class Item
{
public int Value { get; set; }
public DateTimeOffset Start { get; set; }
public DateTimeOffset End { get; set; }
}
public static class EnumerableExtensions
{
public static IEnumerable<Item> WithUpdate(this IEnumerable<Item> enumerable)
{
using (var enumerator = enumerable.GetEnumerator())
{
enumerator.MoveNext();
Item previous, current=null;
previous = (Item)enumerator.Current;
while (enumerator.MoveNext())
{
current = (Item)enumerator.Current;
if (previous.End >= current.Start)
{
previous.End = ((Item)enumerator.Current).Start.AddDays(-1);
}
yield return previous;
previous = (Item)enumerator.Current;
}
yield return current;
}
}
}
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
List<Item> list = new List<Item>() {
new Item() { Value = 1, Start = DateTime.Now, End = DateTime.Now.AddDays(10) },
new Item() { Value = 2, Start = DateTime.Now.AddDays(8), End = DateTime.Now.AddDays(15) },
new Item() { Value = 3, Start = DateTime.Now.AddDays(12), End = DateTime.Now.AddDays(20) }
};
foreach (Item item in list) {
Console.WriteLine("Star ={0},End={1}", item.Start.ToString(), item.End.ToString());
}
foreach (Item item in list.WithUpdate())
{
Console.WriteLine("Star ={0},End={1}", item.Start.ToString(), item.End.ToString());
}
Console.ReadLine();
//Item item = new Item() { Value = 1, Start = DateTime.Now, End = DateTime.Now.AddDays(10) };
}https://stackoverflow.com/questions/58084497
复制相似问题