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);