使用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函数吗?

使用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);
    }
}

请注意,如果有很多范围要合并,这将变得非常缓慢。如果数据量很大,则需要不同的数据结构:区间树。