我必须对以下项目列表进行排序
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
有人能帮助我吗? 感谢。
答案 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)
您可以使用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"))
答案 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