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

时间:2017-02-28 14:36:10

标签: 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        02:16.6 General 
5       Item        37:10.4 Bank 
6       Hidden      NULL    NULL

我想按数据排序Order = 5和Type = General但不改变Bank或​​Suspense的位置。 我总是将Order = 5分组,但在General Type之前和之后我可能有不同的类型。

预期结果:

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

有人能帮助我吗? 感谢。

4 个答案:

答案 0 :(得分:2)

“显而易见”的解决方案是将列表拆分为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);

答案 1 :(得分:0)

您可以使用SkipWhileTakeWhile拆分查询,并在对中间部分进行排序后将其与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"))

答案 2 :(得分:0)

您是否尝试过使用Linq

list = list.OrderBy(i => i.Order).ThenByDescending(i => i.Type).ThenBy(i => i.Data);

答案 3 :(得分:0)

大多数答案都在重新发明轮子和表演噩梦。一些LINQ激光器多次遍历列表。

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

https://msdn.microsoft.com/en-us/library/8ce6t5ad(v=vs.110).aspx

https://msdn.microsoft.com/en-us/library/14at654h(v=vs.110).aspx