Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#对列表项目组进行排序,而不对整个列表进行排序_C#_Sorting - Fatal编程技术网

c#对列表项目组进行排序,而不对整个列表进行排序

c#对列表项目组进行排序,而不对整个列表进行排序,c#,sorting,C#,Sorting,我必须对如下项目列表进行排序 Order Category Data Type 1 Unknown NULL NULL 5 Item 26:59.2 Suspense 5 Item 35:10.1 General 5 Item 35:22.6 General 5 Item 45:24.0 General 5 Item

我必须对如下项目列表进行排序

Order   Category    Data    Type
1       Unknown     NULL    NULL
5       Item        26:59.2 Suspense 
5       Item        35:10.1 General 
5       Item        35:22.6 General 
5       Item        45:24.0 General 
5       Item        02:16.6 General 
5       Item        37:10.4 Bank 
6       Hidden      NULL    NULL
我想通过数据对Order=5和Type=General的数据进行排序,但不改变银行或暂记的位置。 我将始终将Order=5分组,但在常规类型之前和之后可能有不同的类型

预期结果:

Order   Category    Data    Type
1       Unknown     NULL    NULL
5       Item        26:59.2 Suspense 
5       Item        02:16.6 General 
5       Item        35:10.1 General 
5       Item        35:22.6 General 
5       Item        45:24.0 General 
5       Item        37:10.4 Bank 
6       Hidden      NULL    NULL
有人能帮我吗?
谢谢。

您可以使用
SkipWhile
TakeWhile
分解查询,并在对中间部分排序后将其与
Concat
放回一起:

items.TakeWhile(item => item.Order != 5 || item.Type != "General").Concat(
    items.SkipWhile(item => item.Order != 5 || item.Type != "General")
        .TakeWhile(item =>  item.Order == 5 && item.Type == "General")
        .OrderBy(item => item.Date)).Concat(
    items.SkipWhile(item => item.Order != 5 || item.Type != "General")
        .SkipWhile(item => item.Order == 5 && item.Type == "General"))
你试过使用吗

“显而易见”的解决方案是将列表分为3个部分,并对中间位进行排序:

//First part
var start = things.TakeWhile(t => t.Order != 5 || t.Type != "General");

//Middle part
var middle = things
    .SkipWhile(t => t.Order != 5 || t.Type != "General")
    .TakeWhile(t => t.Order == 5 && t.Type == "General")
    .OrderBy(t => t.Data);

//Last part:
var end = things
    .SkipWhile(t => t.Order != 5 || t.Type != "General")
    .SkipWhile(t => t.Order == 5 && t.Type == "General");
最后将它们合并到一个列表中:

var merged = start.Concat(middle).Concat(end);

大多数答案都是重塑车轮和性能噩梦。一些LINQ应答器在列表中迭代多次

已经有了这样做的方法! 找到第一个元素。找到块的长度,然后使用:


按什么排序?数据列?预期的排序结果是什么?您尝试了什么,为什么会出现问题?Equalsk-我已经更新了问题。如果项目出现在订单行->常规->暂记->常规中会发生什么?你如何在不影响你所要求的位置的情况下对其进行排序?如果有更多的块的顺序==5,算法应该如何反应?合并块并单独对每个块进行排序?这种方式将改变带有悬念的银行,我不想要。我编辑了我的答案以更改对Type属性的顺序。请不要这样做。已经有一些方法可以对列表的一部分进行排序(请参见我的答案)不要重新发明轮子。@wischi这里没有轮子重新发明,你的答案实际上也没有回答问题。你在列表中迭代三次,并分配两倍的内存来做一次迭代可以完成的事情(查找第一个和最后一个元素)和一个就地排序。为什么我的帖子没有回答这个问题?@wischi我从来没有说过这是最有效的方法,但有时可读代码胜过速度。你的答案实际上只是几个链接,没有解释如何使用它们。请不要误会,但谓词顺序==5&&Type==“General”以硬代码的形式出现了五次。我认为这不是非常可读或可维护的。如果我想获得第一个匹配项、最后一个匹配项、拆分列表、对需要的列表进行排序并合并它们,那么有很多代码。
var merged = start.Concat(middle).Concat(end);