排序列表,忽略每个第n个元素?

时间:2012-12-28 10:52:01

标签: c#

我有一个列表(我可以将它实现为任何类型的集合提供简洁的解决方案),如下所示:

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进行排序。

我可以写一个算法,但想知道是否有简洁的方法吗?

3 个答案:

答案 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索引的列表以及需要排序的内容。