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 getAdjacentRanges(IEnumerable nums) { var ranges = new List(); 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())); } }