【CSharp】排序3X3的二维点坐标

1. 构建模拟点序列

var list = new List<Tuple<int, int>>();
list.Add(new Tuple<int, int>(1, 2));
list.Add(new Tuple<int, int>(3, 2));
list.Add(new Tuple<int, int>(1, 3));
list.Add(new Tuple<int, int>(2, 2));
list.Add(new Tuple<int, int>(3, 1));
list.Add(new Tuple<int, int>(2, 1));
list.Add(new Tuple<int, int>(2, 3));
list.Add(new Tuple<int, int>(3, 3));
list.Add(new Tuple<int, int>(1, 1));

在这里插入图片描述

2. 先按Y坐标排序

list.OrderBy(item => item.Item2);

在这里插入图片描述

3. 给排序后的坐标增加索引,以进行分组

list.OrderBy(item => item.Item2)
    .Select((item,index) => new Tuple<int, Tuple<int, int>>(index, item));

在这里插入图片描述

4. 按索引进行分组,并对组内成员按X坐标排序

list.OrderBy(item => item.Item2)
    .Select((item,index) => new Tuple<int, Tuple<int, int>>(index, item))
	.GroupBy(item=>item.Item1/3, item=>item.Item2, (key, eItem)=>eItem.OrderBy(item => item.Item1));

在这里插入图片描述

5. 对分组后的数据进行聚合,形成单一集合

list.OrderBy(item => item.Item2)
    .Select((item,index) => new Tuple<int, Tuple<int, int>>(index, item))
	.GroupBy(item=>item.Item1/3, item=>item.Item2, (key, eItem)=>eItem.OrderBy(item => item.Item1))
	.Aggregate(Enumerable.Empty<Tuple<int, int>>(), (current, next)=>current.Concat(next)).ToList();

在这里插入图片描述

6. 完整代码

var list = new List<Tuple<int, int>>();
list.Add(new Tuple<int, int>(1, 2));
list.Add(new Tuple<int, int>(3, 2));
list.Add(new Tuple<int, int>(1, 3));
list.Add(new Tuple<int, int>(2, 2));
list.Add(new Tuple<int, int>(3, 1));
list.Add(new Tuple<int, int>(2, 1));
list.Add(new Tuple<int, int>(2, 3));
list.Add(new Tuple<int, int>(3, 3));
list.Add(new Tuple<int, int>(1, 1));

list.OrderBy(item => item.Item2)
    .Select((item,index) => new Tuple<int, Tuple<int, int>>(index, item))
	.GroupBy(item=>item.Item1/3, item=>item.Item2, (key, eItem)=>eItem.OrderBy(item => item.Item1))
	.Aggregate(Enumerable.Empty<Tuple<int, int>>(), (current, next)=>current.Concat(next)).ToList();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhy29563

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值