首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合并标记间隔的算法

合并标记间隔的算法
EN

Stack Overflow用户
提问于 2019-09-24 16:20:34
回答 1查看 78关注 0票数 0

我有一套Items,每个都有StartEnd

代码语言:javascript
复制
class Item
{
   int Value { get; }
   DateTimeOffset Start { get; }
   DateTimeOffset End { get; }
}

例如:

  • 1:2019/01/01 => 2019/12/31
  • 2:2020/01 => 2020/12/31

因此,有两个不重叠的间隔。值1覆盖整个2019年,值2覆盖整个2020年。

但突然间,我意识到我忘记了其中的一个价值。

  • 3:2019/06/01 => 2019/08/01

所以我想用我忘记的值做某种“导入”操作。

其结果应是:

  • 1:2019/01/31 => 2019/05/31
  • 3:2019/06/01 => 2019/08/01
  • 1:2019/08/02 => 2019/12/31
  • 2:2020/01 => 2020/12/31

如您所见,3值被插入并与现有值协调。应该“合并”,修改现有的间隔,使它们都不重叠。

我不知道如何进行这种生成结果项的“导入”。

EN

回答 1

Stack Overflow用户

发布于 2019-09-24 17:57:23

创建一个扩展方法。我想这个列表是按开始日期排序的。

代码语言:javascript
复制
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) };
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58084497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档