[英]Sort a list with where condition in linq c#
我有一个类型为Test
的List
,它有 4 个properties
, List
需要根据一些特定条件进行排序。 下面是class
Test
的properties
以及示例数据。
class Test
{
int order;
string value;
string dept;
//..... and some others
}
示例json:
[
{
"order":3,
"value":"ABC",
"dept":"A"
},
{
"order":2,
"value":"XYZ",
"dept":"A"
},
{
"order":1,
"value":"ABC2",
"dept":"P"
},
{
"order":4,
"value":"XYZ2",
"dept":"P"
},
{
"order":6,
"value":"ABC3",
"dept":"Z"
},
{
"order":5,
"value":"XYZ3",
"dept":"Z"
},
]
上面的json
数据加载到一个List<Test>
。
我的要求是对上面的列表进行排序,首先是使用dept=P
的项目,然后是dept=A
,然后是dept=Z
,第二个排序标准是order
。
我尝试了OrderBy(x=>x.dept).ThenBy(x=>x.order)
但输出不是预期的。
有没有办法指定应该首先出现在列表中的dept
。
作为一种解决方法,我将List
拆分为多个列表,然后在sorting
后merge
它们,但这不是我认为的最佳解决方案。
我们是否有其他更好和优化的解决方案?
好吧,您可以使用排序规则创建一个列表:
var orderOfDepts = new List<string> { "P", "A", "Z" };
并使用该列表中元素的索引进行排序:
var sortedList = myList.OrderBy(x=> orderOfDepts.IndexOf(x.dept)).ThenBy(x=> x.order).ToList();
PS 如果sortedList
集合不是太大,则此解决方案很好,但是如果它很大或者您在orderOfDepts
列表中有很多排序规则,那么您可能希望将此算法的整体复杂度从 > O(N2)
到接近O(N*logN)
。
为此,我们可以利用Dictionary
的快速查找:
int o;
var orderOfDepts = new Dictionary<string, int>
{
{ "P", 0 },
{ "A", 1 },
{ "Z", 2 }
};
var sortedList = myList
.OrderBy(x => orderOfDepts.TryGetValue(x.dept, out o) ? o : int.MaxValue)
.ThenBy(x=> x.order)
.ToList();
这里我们尝试通过键x.dept
从字典中获取元素。 如果我们没有找到任何东西,我们将项目放在列表的末尾,否则我们使用字典中的值进行排序。
字典的查找是 O(1),因此它将大大提高性能,但代价是构建字典对象所需的时间。 对于少数元素,不建议这样做,第一个解决方案更好,但对于大量数据,此解决方案很好。
尝试这个:
var orderOfDepts = new List<string> { "P", "A", "Z" };
var sortedList =
(
from x in myList
join dept in orderOfDepts.Select((name, index) => new { name, index }) on x.dept equals dept.name
orderby dept.index, x.order
select x
).ToList();
它应该是相当有效的。
你可以这样做
var result = _context.OrderBy(p => new { p.dept, p.order}).ToList();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.