C # implementation gets a range of values ​​and the union of these ranges

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

Intersect / Merge Ranges

I need a C # implementation (possibly a collection) that takes a list of ranges (ints) and concatenates them. Then I need to iterate over all the ints in this collection (also the numbers between the ranges) Is there a library / implementation, so I don't need to rewrite everything myself?

+3
source share
5 answers

The simplest thing that comes to my mind is to use Enumerable.Range and then handle the various IEnumerable with the standard linq operators. Sort of:

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
+1

, .

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);
    }
}
+3

​​ 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);
+1

System.Collections.Generic.HashSet :

  • UnionWith( IEnumerable<T> other ). HashSet, , , , .
  • IntersectWith( IEnumerable<T> other ). HashSet, , .
0
source

The data structure you are looking for is called the "spanning tree".

You can find various implementations on the net.

For example, here: http://www.emilstefanov.net/Projects/RangeSearchTree.aspx

0
source

All Articles