
这似乎可行并且很容易理解。
public static IEnumerable<Range<T>> Collapse<T>(this IEnumerable<Range<T>> me, IComparer<T> comparer) { List<Range<T>> orderdList = me.OrderBy(r => r.Start).ToList(); List<Range<T>> newList = new List<Range<T>>(); T max = orderdList[0].End; T min = orderdList[0].Start; foreach (var item in orderdList.Skip(1)) { if (comparer.Compare(item.End, max) > 0 && comparer.Compare(item.Start, max) > 0) { newList.Add(new Range<T> { Start = min, End = max }); min = item.Start; } max = comparer.Compare(max, item.End) > 0 ? max : item.End; } newList.Add(new Range<T>{Start=min,End=max}); return newList; }这是我在评论中提到的变体。基本上是同一回事,但是要进行一些检查和得出结果,而不是在返回之前将其收集在列表中。
public static IEnumerable<Range<T>> Collapse<T>(this IEnumerable<Range<T>> ranges, IComparer<T> comparer) { if(ranges == null || !ranges.Any()) yield break; if (comparer == null) comparer = Comparer<T>.Default; var orderdList = ranges.OrderBy(r => 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) > 0 && comparer.Compare(current.Start, max) > 0) { yield return Create(min, max); min = current.Start; } max = comparer.Compare(max, current.End) > 0 ? max : current.End; } yield return Create(min, max); }欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)