Linq orderby,从具体数字开始,然后返回最低

How*_*haw 20 c# linq

我有一组数据,我想从特定的数字开始重新排序,然后,当达到最高数字时,返回到最低值,然后继续递增.

例如,对于序列(1,2,3,4,5,6),如果4是特定数字,则顺序将变为(4,5,6,1,2,3).

这对linq&c#有可能吗?

L.B*_*L.B 27

List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6 };
int num = 4;
var newList = list.SkipWhile(x=>x!=num)
                    .Concat(list.TakeWhile(x=>x!=num))
                    .ToList();
Run Code Online (Sandbox Code Playgroud)


Che*_*hen 10

int specific = 4;
var numbers = Enumerable.Range(1, 9);

var result = numbers.OrderBy(n => Tuple.Create(n < speficic, n)).ToList();
Run Code Online (Sandbox Code Playgroud)

我在这里使用一个小技巧,Tuple<bool, int>用作比较器,因为false < true.另一种选择是:

var result = numbers.OrderBy(n => n < speficic).ThenBy(n => n).ToList();
Run Code Online (Sandbox Code Playgroud)

在基准测试后编辑我发现第二个解决方案.OrderBy .ThenByTuple解决方案快得多.我相信这是因为FCL Comparer<T>.Default用作比较器,这需要花费时间来构建.