c#implementation获取这些范围的值范围和并集

时间:2011-05-10 23:24:43

标签: c# collections union range

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

Range intersection / union

我需要一个C#实现(可能是一个集合),它接受一系列范围(整数)并进行联合。 然后我需要迭代这个集合中的所有int(也是范围之间的数字) 是否有任何库/实现,以便我不必自己重写所有内容?

5 个答案:

答案 0 :(得分:3)

您可以查看this implementation,看看它是否符合您的需求。

将范围与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);
    }
}

答案 1 :(得分:1)

我想到的最简单的事情是使用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<IEnumerable<int>>或类似的东西中,然后迭代元素以生成单个元素列表:

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

答案 2 :(得分:1)

以下是vanilla 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);

答案 3 :(得分:0)

System.Collections.Generic.HashSet就是这样:

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

答案 4 :(得分:0)

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

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

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