Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>This seems to works and is easy to understand.</p> <pre><code> public static IEnumerable&lt;Range&lt;T&gt;&gt; Collapse&lt;T&gt;(this IEnumerable&lt;Range&lt;T&gt;&gt; me, IComparer&lt;T&gt; comparer) { List&lt;Range&lt;T&gt;&gt; orderdList = me.OrderBy(r =&gt; r.Start).ToList(); List&lt;Range&lt;T&gt;&gt; newList = new List&lt;Range&lt;T&gt;&gt;(); T max = orderdList[0].End; T min = orderdList[0].Start; foreach (var item in orderdList.Skip(1)) { if (comparer.Compare(item.End, max) &gt; 0 &amp;&amp; comparer.Compare(item.Start, max) &gt; 0) { newList.Add(new Range&lt;T&gt; { Start = min, End = max }); min = item.Start; } max = comparer.Compare(max, item.End) &gt; 0 ? max : item.End; } newList.Add(new Range&lt;T&gt;{Start=min,End=max}); return newList; } </code></pre> <hr> <p>Here is the variation which I mentioned in the comments. It's basically the same thing, but with some checking and yielding of the results instead of collecting in a list before returning.</p> <pre><code> public static IEnumerable&lt;Range&lt;T&gt;&gt; Collapse&lt;T&gt;(this IEnumerable&lt;Range&lt;T&gt;&gt; ranges, IComparer&lt;T&gt; comparer) { if(ranges == null || !ranges.Any()) yield break; if (comparer == null) comparer = Comparer&lt;T&gt;.Default; var orderdList = ranges.OrderBy(r =&gt; r.Start); var firstRange = orderdList.First(); T min = firstRange.Start; T max = firstRange.End; foreach (var current in orderdList.Skip(1)) { if (comparer.Compare(current.End, max) &gt; 0 &amp;&amp; comparer.Compare(current.Start, max) &gt; 0) { yield return Create(min, max); min = current.Start; } max = comparer.Compare(max, current.End) &gt; 0 ? max : current.End; } yield return Create(min, max); } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload