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

100
08 апреля 2022, 14:10

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

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]);
        }
Answer 1

Как вариант:

  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}
READ ALSO
Нужно ли корректировать верстку так, чтобы при масштабировании нигде ничего не выпирало?

Нужно ли корректировать верстку так, чтобы при масштабировании нигде ничего не выпирало?

Нужно ли вообще корректировать верстку так, чтоб при масштабировании нигде ничего не выпирало и тд? Вот как выглядит отверстанная часть...

77
Производительность тегов HTML

Производительность тегов HTML

Есть ли разница в производительности между тегами? Например у меня (образно) 10000 слов данных, каждое слово нужно обернуть в тег Влияет ли выбор...

139
Кнопка навигации

Кнопка навигации

Как сделать кнопку навигации по сайту, или же чтоб кнопка переводила на опреденный элемент страницы?

207
Вставить div под js скрипт

Вставить div под js скрипт

Можно ли вставить DIV блок под исполняемый скрипт, если нет за что зацепиться в плане id или class?

171