我有一个List
类型的Test
,其具有4properties
和List
需要与一些特定的条件进行排序。以下是properties
ofclass
Test
以及示例数据。
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
分成多个列表,然后merge
在之后sorting
,将它们分成多个列表,但这并不是我认为的最佳解决方案。
我们是否还有其他更好且优化的解决方案?
好了,您可以使用排序规则创建一个列表:
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
s的快速查找:
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();
在这里,我们尝试通过key从字典中获取元素x.dept
。如果找不到任何内容,则将其放在列表的末尾,否则将使用字典中的值进行排序。
字典的查找为O(1),因此它将大大提高性能,而浪费了构造字典对象所需的时间。对于很少的元素,这样做是不明智的,第一个解决方案会更好,但对于大量数据,此解决方案会很好。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句