簡體   English   中英

在linq c#中使用where條件對列表進行排序

[英]Sort a list with where condition in linq c#

我有一個類型為TestList ,它有 4 個propertiesList需要根據一些特定條件進行排序。 下面是class Testproperties以及示例數據。

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拆分為多個列表,然后在sortingmerge它們,但這不是我認為的最佳解決方案。

我們是否有其他更好和優化的解決方案?

好吧,您可以使用排序規則創建一個列表:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM