为了账号安全,请及时绑定邮箱和手机立即绑定

在 linq C# 中使用 where 条件对列表进行排序

在 linq C# 中使用 where 条件对列表进行排序

C#
慕姐4208626 2023-09-24 10:51:46
我有一个Listof 类型Test,有 4 个properties,List需要根据一些特定条件进行排序。properties以下是class 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数据加载到 1 中List<Test>。我的要求是对上面的列表进行排序,首先对项目进行排序dept=P,然后dept=A对项目dept=Z进行排序,第二个排序标准是order。我尝试过,OrderBy(x=>x.dept).ThenBy(x=>x.order)但输出不是预期的。有什么方法可以指定哪个dept应该首先出现在列表中。作为解决方法,我将 分成List多个列表,然后将merge它们拆分为sorting,但这不是我认为的最佳解决方案。对此我们还有其他更好、优化的解决方案吗?
查看完整描述

3 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

尝试这个:


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

它应该是相当有效的。


查看完整回答
反对 回复 2023-09-24
?
jeck猫

TA贡献1909条经验 获得超7个赞

你可以这样做

var result = _context.OrderBy(p => new { p.dept, p.order}).ToList();


查看完整回答
反对 回复 2023-09-24
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

好吧,您可以使用排序规则创建一个列表:


var orderOfDepts = new List<string> { "P", "A", "Z" };

并使用该列表中元素的索引进行排序:


var sortedList = myList.OrderBy(x=> orderOfDepts.IndexOf(x.dept)).ThenBy(x=> x.order).ToList();

sortedListPS 如果集合不是太大,那么这个解决方案很好,但如果它很大或者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();

这里我们尝试通过 key 从字典中获取元素x.dept。如果我们没有找到任何内容,我们会将该项放在列表的末尾,否则我们将使用字典中的值进行排序。


字典的查找时间复杂度为 O(1),因此它将极大地提高性能,但代价是构造字典对象所需的时间。对于少数元素,不建议这样做,第一个解决方案更好,但对于大量数据,这个解决方案很好。


查看完整回答
反对 回复 2023-09-24
  • 3 回答
  • 0 关注
  • 87 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信