使用Linq合并和转换字符串间隔

时间:2014-09-22 08:38:22

标签: c# string linq

我有"0""1000000000000000"(10 15 )的时间间隔,表示string形式的"123-456789012345"个对象,即{{ 1}}。

我想合并重叠或包含其他区间的区间,并使用linq转换为"{start}-{end}"类型。

到目前为止,我只使用下面的代码订购了区间,其中long(例如)

r

有人可以共享我将用于合并和转换间隔的Linq函数吗?

1 个答案:

答案 0 :(得分:0)

Here's one approach

void Main()
{
    var rangesInput = new[]
    {
        "123-456",
        "400-191",
    };

    var ranges = (from x in rangesInput
                  let s = x.Split('-')
                  select new Range(long.Parse(s[0]), long.Parse(s[1])))
                .Aggregate(new List<Range>(), (agg, range) =>
                {
                    var intersecting = agg.FirstOrDefault(r => range.Intersects(r));

                    if (intersecting != null)
                    {
                        intersecting.UnionWith(range);
                    }
                    else
                    {
                        agg.Add(range);
                    }

                    return agg;
                });
    ranges.Dump();
}

class Range
{
    public Range(long end1, long end2)
    {
        Start = Math.Min(end1, end2);
        End = Math.Max(end1, end2);
    }

    public long Start { get; private set; }
    public long End { get; private set; }

    public bool Intersects(Range range) => Math.Max(range.Start, Start) <= Math.Min(range.End, End);

    public void UnionWith(Range range)
    {
        Start = Math.Min(Start, range.Start);
        End = Math.Max(End, range.End);
    }
}

请注意,如果要合并很多范围,这将会非常慢。如果数据量很大,您需要不同的数据结构:an interval tree