using System.Collections.Generic;
public static void Main()
var myList = new List<string> { "1", "3-6", "2", "8-10", "7", "11", "13-18", "12" };
var ranges = myList.Select(x=> new Range(x)).ToList();
foreach (var range in ranges) Console.WriteLine(range);
Console.WriteLine(string.Join(", ", ranges));
public class Range : IComparable<Range>
public Range(string input, char separator= '-') {
if (!input.Contains(separator))
if (int.TryParse(input, out int value))
Min = value; Max = value;
throw new ArgumentException(input + " is not a valid input !");
var parts = input.Split(new char[] { separator }, 2);
if (int.TryParse(parts[0], out int part1) && int.TryParse(parts[1], out int part2))
Min = Math.Min(part1, part2);
Max = Math.Max(part1, part2);
throw new ArgumentException(input + " is not a valid input !" );
public int Min { get; set; }
public int Max { get; set; }
public int CompareTo(Range obj)
var mincomparer = this.Min.CompareTo(obj.Min);
var maxcomparer = this.Max.CompareTo(obj.Max);
return mincomparer == 0 ? maxcomparer : mincomparer;
public override string ToString()
return Min == Max ? Min.ToString() : Min + "-" + Max;