C#实现获取值的范围以及这些范围的并集

发布于 2024-11-06 07:30:46 字数 231 浏览 3 评论 0 原文

我的情况在这个问题中得到了很好的解释:

范围交集/并集

我需要一个 C# 实现(可能是一个集合),它采用(整数)范围列表并对它们进行并集。 然后我需要迭代这个集合中的所有整数(也是范围之间的数字) 是否有任何库/实现,这样我就不必自己重写所有内容?

I have a situation that is well explained in this question:

Range intersection / union

I need a C# implementation (a collection maybe) that takes a list of ranges (of ints) and do the union of them.
Then I need to iterate through all ints in this collection (also numbers between ranges)
Are there any library/implementation so that I don't have to rewrite everything by myself?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

忆伤 2024-11-13 07:30:46

您可以查看此实现,看看它是否满足您的需求。

使用 Range.Coalesce 组合范围:

var range1 = Range.Create(0, 5, "Range 1");
var range2 = Range.Create(11, 41, "Range 2");
var range3 = Range.Create(34, 50, "Range 3");
var ranges = new List<Range> { range1, range2, range3 };
var unioned = Range.Coalesce(ranges);

使用 .Iterate 迭代范围:

foreach (var range in unioned)
{
    foreach (int i in range.Iterate(x => x + 1))
    {
        Debug.WriteLine(i);
    }
}

You might take a look at this implementation and see if it will fit your needs.

Combine ranges with Range.Coalesce:

var range1 = Range.Create(0, 5, "Range 1");
var range2 = Range.Create(11, 41, "Range 2");
var range3 = Range.Create(34, 50, "Range 3");
var ranges = new List<Range> { range1, range2, range3 };
var unioned = Range.Coalesce(ranges);

Iterate over ranges with .Iterate:

foreach (var range in unioned)
{
    foreach (int i in range.Iterate(x => x + 1))
    {
        Debug.WriteLine(i);
    }
}
命硬 2024-11-13 07:30:46

我想到的最简单的事情是使用 Enumerable.Range,然后使用标准 linq 运算符处理不同的 IEnumerable。类似的东西:

var list = Enumerable.Range(1, 5)
.Concat(Enumerable.Range(7, 11))
.Concat(Enumerable.Range(13, 22))

foreach(var number in list)
  // Do something

显然你也可以使用 Union 和 Intersect...显然你也可以将你的范围放在 List> 或类似的东西中,然后迭代元素以生成单个元素列表:

var ranges = new List<IEnumerable<int>> 
{ 
    Enumerable.Range(1, 5), 
    Enumerable.Range(7, 11), 
    Enumerable.Range(10, 22) 
};
var unionOfRanges = Enumerable.Empty<int>();

foreach(var range in ranges)
    unionOfRanges = unionOfRanges.Union(range);

foreach(var item in unionOfRanges)
    // Do something

The simplest thing that comes to my mind is to use Enumerable.Range, and then treat the different IEnumerable with standard linq operators. Something like:

var list = Enumerable.Range(1, 5)
.Concat(Enumerable.Range(7, 11))
.Concat(Enumerable.Range(13, 22))

foreach(var number in list)
  // Do something

Obviously you can use Union and Intersect as well... clearly you can also put your ranges in a List<IEnumerable<int>> or something similar and then iterate over the elements for producing a single list of the elements:

var ranges = new List<IEnumerable<int>> 
{ 
    Enumerable.Range(1, 5), 
    Enumerable.Range(7, 11), 
    Enumerable.Range(10, 22) 
};
var unionOfRanges = Enumerable.Empty<int>();

foreach(var range in ranges)
    unionOfRanges = unionOfRanges.Union(range);

foreach(var item in unionOfRanges)
    // Do something
离线来电— 2024-11-13 07:30:46

以下是普通的 Linq 实现:

var r1 = Enumerable.Range(1,10);
var r2 = Enumerable.Range(20,5);
var r3 = Enumerable.Range(-5,10);

var union = r1.Union(r2).Union(r3).Distinct();

foreach(var n in union.OrderBy(n=>n))
    Console.WriteLine(n);

The following is vanilla Linq implementation:

var r1 = Enumerable.Range(1,10);
var r2 = Enumerable.Range(20,5);
var r3 = Enumerable.Range(-5,10);

var union = r1.Union(r2).Union(r3).Distinct();

foreach(var n in union.OrderBy(n=>n))
    Console.WriteLine(n);
猫瑾少女 2024-11-13 07:30:46

System.Collections.Generic.HashSet 有这样的东西:

  • UnionWith(IEnumerable其他)。修改当前 HashSet 对象以包含其自身、指定集合或两者中存在的所有元素。
  • IntersectWith( IEnumerable other )。修改当前 HashSet 对象以仅包含该对象和指定集合中存在的元素。

System.Collections.Generic.HashSet has just the thing:

  • UnionWith( IEnumerable<T> other ). Modifies the current HashSet object to contain all elements that are present in itself, the specified collection, or both.
  • IntersectWith( IEnumerable<T> other ). Modifies the current HashSet object to contain only elements that are present in that object and in the specified collection.
作妖 2024-11-13 07:30:46

您正在寻找的数据结构称为“区间树”。

您可以在网上找到不同的实现。

例如,这是一个: http://www.emilstefanov.net/Projects/RangeSearchTree.aspx

The data structure you are looking for is called an "interval tree".

You can find different implementations on the net.

For example here's one: http://www.emilstefanov.net/Projects/RangeSearchTree.aspx

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文