使用Linq合并和转换字符串间隔
本文关键字:字符串 转换 Linq 合并 使用 | 更新日期: 2023-09-27 18:23:48
我的区间范围从"0"
到"1000000000000000"
(1015),表示在形式为"123-456789012345"
的string
对象中,即"{start}-{end}"
。
我想合并重叠或包含在其他区间中的区间,并使用linq转换为类型long
。
到目前为止,我只使用下面的代码订购了间隔,其中r
(例如)是
string[] r = new[]
{
"123-456",
"400-191"
};
var range = r.OrderBy(entry => long.Parse(entry.Split('-')[0]))
.ThenBy(entry => long.Parse(entry.Split('-')[1]))
.ToArray();
有人能分享一个我用来合并和转换间隔的Linq函数吗?
这里有一种方法:
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);
}
}
请注意,如果有很多范围要合并,这将变得非常缓慢。如果数据量很大,则需要不同的数据结构:区间树。