Имеется список со значениями координат:
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]);
}
Как вариант:
пример кода
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}
Продвижение своими сайтами как стратегия роста и независимости