我有一个列表(我可以将它实现为任何类型的集合提供简洁的解决方案),如下所示:
4,1,5,2,1,3,8,1,6,4,2,3
列表实际上是3个值的组,它的长度始终是3的倍数。组的前2个值与组的第3个值之间没有关系。
我想对数组进行排序,使每个第3个值都保留在原位。对于我给出的例子,结果将是:
1,1,5,1,2,3,2,4,6,4,8,3
已对索引为0,1,3,4,6和7的元素进行了排序。索引为2,5和8的元素尚未排序。
另一种表达方式是想象列表是x,x,y,x,x,y,x,x,y,x,x,y,我想只对x进行排序。
我可以写一个算法,但想知道是否有简洁的方法吗?
答案 0 :(得分:2)
除非你非常渴望真正有效地做到这一点,否则我会选择简单的解决方案:
类似于:
var list = ...; // Get hold of the whole list.
var sortedElements = list.Where((value, index) => index % 3 != 2)
.OrderBy(x => x)
.ToList();
for (int i = 0; i < sortedElements.Count; i++)
{
int index = (i / 2) * 3 + i % 2;
list[index] = sortedElements[i];
}
答案 1 :(得分:1)
尝试以下linq
var ints = new int[]{4,1,5,2,1,3,8,1,6,4,2,3};
var result = ints.Where((i,j) => j%3!= 2).OrderBy(i=>i).ToArray();
var index = ints.Select ((i , j)=>
{
if (j%3==2)
return i;
else
return result[(j/3)*2 + j%3];
});
它是如何工作的
1.取排序数组忽略非必需值
2.从原始数组准备输出数组,其中每个三元组的前2个值来自排序数组。
答案 2 :(得分:0)
我假设取出每个第三个值并单独保留它,然后对所有内容进行排序并再次插入值最简单。
numbers.Where((n, index) => (index + 1) % 3 == 0);
numbers.Where((n, index) => (index + 1) % 3 != 0);
这为您提供了thrid索引的列表以及需要排序的内容。