c# linq группировка по диапазону с условием

Имеется список со значениями координат:

List<(int,int)> coord = new List<(int,int)>() {(554,79),(553,79),(554,79), (23,600),(22,600),(22,600)};

Необходимо сгруппировать диапазон по item1

554,553,554

и

23,22,22

Группировку делаю так:

 List<(int,int)> g_coord = coord.OrderBy(x => x.Item1).ToList(); 

Как мне захватить в группировку рядом стоящие числа (554 и 553, 22 и 23) Т.е там где координата отличается всего на 1?

Пока сделал такой костыль:

       List<(int, int)> coords = new List<(int, int)>() {
        (553,126),
        (554,126),
        (554,127),
        (553,126),
        (41,126),
        (40,126),
        (45,120),
        (44,120),
        (46,120),
        (553,127),
        (1001,44),
        (1002,45),
        };

        List<(int, int)> newcoords = new List<(int, int)>();
// Удалить дубликаты
        coords = coords.GroupBy(x => x.Item1).Select(x => x.First()).ToList();
// перебор списка
        for (var j = 0; j < coords.Count(); j++)
        {

            //Console.WriteLine(coords[j].Item1 + "x" + coords[j].Item2);
            for (var i = 0; i < coords.Count(); i++)
            {
                // Console.WriteLine(coords[j].Item1+ "==" +coords[i].Item1);
                if (Math.Abs(coords[j].Item1 - coords[i].Item1)==1) { 
                    coords.RemoveAt(i);
                }
            }
            newcoords.Add(coords[j]);

        }

Ответы (1 шт):

Автор решения: pasha goroshko

Как вариант:

  1. Узнаете количество цифр в каждом числе(ведь 50 и 500 должны попасть в разные группировки)
  2. Узнаете первую цифру каждого числа( в 50 и 500 это будет 5)
  3. Группируете по первому числу и по количеству цифр в числе( т е {5, 2} и {5,3} будет две группировки.

пример кода

        var integs = new[] { 501, 551, 523, 20, 40 };

        var res = integs
            .Select(x => new
            {
                Count = (int)Math.Log10(x) + 1,
                Value = x
            })
            .Select(x => new
            {
                First = x.Value / (int)Math.Pow(10, x.Count - 1),
                Count = x.Count,
                Value = x.Value
            })
            .GroupBy(x => new { x.First, x.Count })
            .ToArray();

Вывод:

{{5,3} => 501, 551, 523}
{{2,2} => 20}
{{4,2} => 40}
→ Ссылка