using System;
using System.Linq;
using System.Collections.Generic;
public class Test
{
class Range
{
public int? Start { get; set; }
public int? End { get; set; }
}
private static IEnumerable<Range> getAdjacentRanges(IEnumerable<int> nums)
{
var ranges = new List<Range>();
if (!nums.Any())
return ranges;
var ordered = nums.OrderBy(i => i);
int lowest = ordered.First();
ranges.Add(new Range { Start = lowest });
int last = lowest;
Range lastRange = null;
foreach (int current in ordered)
{
lastRange = ranges[ranges.Count - 1];
if (current > last + 1)
{
lastRange.End = last;
ranges.Add(new Range { Start = current });
}
last = current;
}
return ranges;
}
public static void Main()
{
var arr = new[] { 1, 2, 3, 4, 8, 9, 10, 15 };
var ranges = getAdjacentRanges(arr)
.Select(r => r.End.HasValue ? string.Format("{0}-{1}", r.Start, r.End) : r.Start.ToString());
Console.Write(string.Join(",",ranges.ToArray()));
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTGlucTsKdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CgpwdWJsaWMgY2xhc3MgVGVzdAp7CiAgICAgICBjbGFzcyBSYW5nZQogICAgICAgIHsKICAgICAgICAgICAgcHVibGljIGludD8gU3RhcnQgeyBnZXQ7IHNldDsgfQogICAgICAgICAgICBwdWJsaWMgaW50PyBFbmQgeyBnZXQ7IHNldDsgfQogICAgICAgIH0KCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgSUVudW1lcmFibGU8UmFuZ2U+IGdldEFkamFjZW50UmFuZ2VzKElFbnVtZXJhYmxlPGludD4gbnVtcykKICAgICAgICB7CiAgICAgICAgICAgIHZhciByYW5nZXMgPSBuZXcgTGlzdDxSYW5nZT4oKTsKICAgICAgICAgICAgaWYgKCFudW1zLkFueSgpKQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlczsKCiAgICAgICAgICAgIHZhciBvcmRlcmVkID0gbnVtcy5PcmRlckJ5KGkgPT4gaSk7CiAgICAgICAgICAgIGludCBsb3dlc3QgPSBvcmRlcmVkLkZpcnN0KCk7CiAgICAgICAgICAgIHJhbmdlcy5BZGQobmV3IFJhbmdlIHsgU3RhcnQgPSBsb3dlc3QgfSk7CiAgICAgICAgICAgIGludCBsYXN0ID0gbG93ZXN0OwogICAgICAgICAgICBSYW5nZSBsYXN0UmFuZ2UgPSBudWxsOwoKICAgICAgICAgICAgZm9yZWFjaCAoaW50IGN1cnJlbnQgaW4gb3JkZXJlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbGFzdFJhbmdlID0gcmFuZ2VzW3Jhbmdlcy5Db3VudCAtIDFdOwogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQgPiBsYXN0ICsgMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBsYXN0UmFuZ2UuRW5kID0gbGFzdDsKICAgICAgICAgICAgICAgICAgICByYW5nZXMuQWRkKG5ldyBSYW5nZSB7IFN0YXJ0ID0gY3VycmVudCB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxhc3QgPSBjdXJyZW50OwogICAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuIHJhbmdlczsKICAgICAgICB9CiAgICAgICAgCglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCgl7CgkgICAgICAgIHZhciBhcnIgPSBuZXdbXSB7IDEsIDIsIDMsIDQsIDgsIDksIDEwLCAxNSB9OwogICAgICAgICAgICB2YXIgcmFuZ2VzID0gZ2V0QWRqYWNlbnRSYW5nZXMoYXJyKQogICAgICAgICAgICAgICAgLlNlbGVjdChyID0+IHIuRW5kLkhhc1ZhbHVlID8gc3RyaW5nLkZvcm1hdCgiezB9LXsxfSIsIHIuU3RhcnQsIHIuRW5kKSA6IHIuU3RhcnQuVG9TdHJpbmcoKSk7CiAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoc3RyaW5nLkpvaW4oIiwiLHJhbmdlcy5Ub0FycmF5KCkpKTsKCX0KfQ==