C# 对列表进行排序,忽略每个第n个元素?

C# 对列表进行排序,忽略每个第n个元素?,c#,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,

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

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


我可以写一个算法,但不知道是否有简洁的方法可以做到这一点?

除非你非常渴望有效地做到这一点,否则我会选择一个简单的解决方案:

  • 将要排序的元素提取到新列表中
  • 对列表排序
  • 构建一个新列表,将要排序的元素与固定的元素合并,或者(如果您更喜欢使用可变集合)将排序后的元素放回原始列表中
比如:

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];
}
var list=…;//掌握全部清单。
var sortedElements=list.Where((值,索引)=>索引%3!=2)
.OrderBy(x=>x)
.ToList();
for(int i=0;i
我假设,取出每三个值,并将其分开保存,然后对所有内容进行排序并再次插入值将是最简单的方法

numbers.Where((n, index) => (index + 1) % 3 == 0);
numbers.Where((n, index) => (index + 1) % 3 != 0);
这将为您提供第三个索引的列表以及需要排序的内容。

尝试以下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个值从原始数组准备输出数组。

这可能更适合于代码审查(在您建议/编写算法之后)。@flem我同意您的观点,但SO的目的之一肯定是为了学习和进步?编写算法很简单。我的目的是寻求更简洁的方法。谢谢。我希望我能接受两个答案。我喜欢在这里使用LINQ,但我确实认为John Skeet的解决方案更容易阅读(当然,总有一天会有其他人阅读)。出于这个原因,我接受约翰的解决方案,并对你的方案投了赞成票。再次感谢。他是乔恩,不是约翰。也请投票表决这个答案。有多个答案总是很好的,这就是论坛的魅力所在。谢谢你,约翰。最初的评论(删除后)要求我“告诉我你先做了什么”,我非常沮丧,开始编写算法。当我看到这个响应时,我正准备进行测试,但我现在可以从2个fugly
for
循环,构建2个列表,然后重新合并,转到一个更优雅的方法,这正是我所寻求的。再次感谢,我学到了一些东西,有了一个新的工具!:)