• 0

C# Compare Multiple Ranges to Multiple Ranges


Question

I've spent a lot of time trying to think through this issue on my own, but I'm not getting a better answer than what I have and my answer is HORRIBLE.  So...  feel free to pop me upside my head and say; "dumbass...."

 

I have a situation where I have multiple ranges.  i.e. 100 to 200 and 100 to 200 (yes that is the same value ranges, but each range is a separate list of property values.  (just go with it)   I have a second set of values.  Each object in this second set can have a range within those two ranges.  (I'll give examples below)  What I am attempting to find out is the subset of values from the first sets that are not within the second set.

 

Property Sets

"Set1"  range from 0 to 3

"Set2"  range from 0 to 3

 

Object Sets

"Object1"  range for "Set1" from 0 to 2, range for "Set2" 0 to 3

"Object2"  range for "Set1" from 0 to 3, range for "Set2" 0 to 2

 

In this example this example there would be a subset for for the values not found in the objects that would equal

Set1 3, Set2, 3

Link to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 0

So,

Object Sets define a sub-range of the property sets.

And you are trying to find the values NOT covered in the sub-range?

Rephrasing,

Set1 and Set2 are ranges of values, while Object1 and Object2 define sub-range of Set1 and Set2.

Which values are not in the sub-ranges of Object1 and Object2?

Do you want a list of these values back?

EDIT: Or you want the list of items which different between range of Set1 and range of Set2 in Object1/Object2?

EDIT 3: Nvm...

EDIT 4: Here is a hint on my current understanding,

            var ss1 = set1.Take(object1.range1.To)
                .Skip(object1.range1.From);

            var ss2 = set2.Take(object1.range2.To)
                .Skip(object1.range2.From);


            var answerForObject1 = ss1
                .Except(ss2)
                .Union(ss2.Except(ss1))
                .ToList();
Edited by _Alexander
Link to comment
Share on other sites

  • 0

If these are contiguous sequences of natural numbers, then you can simply compare the bounds which would be more efficient than a more general solution based on Except as already suggested.
 
For example, if the complete range is { 100..200 }, and the object range is { 150..175 }, then the set of missing values is { 100..149 } U { 176.. 200 }. More generally speaking if the complete range is { C1..C2 } and the object range is { O1..O2 }, then the set of missing values is { C1..O1 - 1 } U { O2 + 1..C2 }.

In C#:

Enumerable.Range(c1, o1-c1).Concat(Enumerable.Range(o2+1, c2-o2))

Of course this assumes that o1>=c1 and o2<=c2.

Link to comment
Share on other sites

This topic is now closed to further replies.