我有"0"
到"1000000000000000"
(10 15 )的时间间隔,表示string
形式的"123-456789012345"
个对象,即{{ 1}}。
我想合并重叠或包含其他区间的区间,并使用linq转换为"{start}-{end}"
类型。
到目前为止,我只使用下面的代码订购了区间,其中long
(例如)
r
有人可以共享我将用于合并和转换间隔的Linq函数吗?
答案 0 :(得分:0)
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。