This is not very effective, but it is idiomatic:
var nums = new HashSet<int>{0, 1, 2, 3, 4, 7, 8, 9, 11}; IEnumerable<Tuple<int, int>> ranges = Enumerable.Zip( nums.Where(n => !nums.Contains(n - 1)), nums.Where(n => !nums.Contains(n + 1)), Tuple.Create);
More efficient if it is sorted:
public IEnumerable<Tuple<int, int>> GetContiguousRanges(IEnumerable<int> nums) { int start = nums.First(); int last = start - 1; foreach (int i in nums) { if (i != last + 1) { yield return Tuple.Create(start, last); start = i; } last = i; } yield return Tuple.Create(start, last); }
Alastair maw
source share