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

我有一个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,但这不是我认为的最佳解决方案。


对此我们还有其他更好、优化的解决方案吗?


慕姐4208626
浏览 168回答 3
3回答

慕田峪9158850

尝试这个:var orderOfDepts = new List<string> { "P", "A", "Z" };var sortedList =(&nbsp; &nbsp; from x in myList&nbsp; &nbsp; join dept in orderOfDepts.Select((name, index) => new { name, index }) on x.dept equals dept.name&nbsp; &nbsp; orderby dept.index, x.order&nbsp; &nbsp; select x).ToList();它应该是相当有效的。

jeck猫

你可以这样做var&nbsp;result&nbsp;=&nbsp;_context.OrderBy(p&nbsp;=>&nbsp;new&nbsp;{&nbsp;p.dept,&nbsp;p.order}).ToList();

慕丝7291255

好吧,您可以使用排序规则创建一个列表: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>&nbsp;{&nbsp; &nbsp;{ "P", 0 },&nbsp; &nbsp;{ "A", 1 },&nbsp; &nbsp;{ "Z", 2 }};var sortedList = myList.OrderBy(x => orderOfDepts.TryGetValue(x.dept, out o) ? o : int.MaxValue)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.ThenBy(x=> x.order)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.ToList();这里我们尝试通过 key 从字典中获取元素x.dept。如果我们没有找到任何内容,我们会将该项放在列表的末尾,否则我们将使用字典中的值进行排序。字典的查找时间复杂度为 O(1),因此它将极大地提高性能,但代价是构造字典对象所需的时间。对于少数元素,不建议这样做,第一个解决方案更好,但对于大量数据,这个解决方案很好。
打开App,查看更多内容
随时随地看视频慕课网APP