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();