簡體   English   中英

LINQ OrderBy / ThenBy帶條件排序

[英]LINQ OrderBy / ThenBy with conditional sorting

我試圖按日期排序列表,然后按描述名稱排序,但是我需要具有特定描述的所有元素作為每個日期的頂部元素。

例:

01-02-2014 "Description A"
01-02-2014 "Description B"
01-02-2014 "Description C"
01-02-2014 "Description D"
01-02-2014 "Description E"

02-02-2014 "Description A"
02-02-2014 "Description B"
02-02-2014 "Description C"
02-02-2014 "Description D"
02-02-2014 "Description E"

我需要它如何排序是按日期和描述,但也是每個日期內列表頂部的所有描述B元素。 像這樣,

01-02-2014 "Description B" <-- Top (Rest below is still sorted ascending)
01-02-2014 "Description A"
01-02-2014 "Description C"
01-02-2014 "Description D"
01-02-2014 "Description E"

02-02-2014 "Description B" <-- Top (Rest below is still sorted ascending)
02-02-2014 "Description A"
02-02-2014 "Description C"
02-02-2014 "Description D"
02-02-2014 "Description E"

我試過用LINQ做這個,但我不確定它是否可以作為單個查詢完成。

return ListOfItems.OrderByDescending(x => x.Date).ThenBy(x => x.Type)

這一系列的排序語句將對其示例的顯示方式進行排序

return ListOfItems.OrderBy(x => x.Date)
                  .ThenByDescending(x => x.Type == "Description B")
                  .ThenBy(x => x.Type);

更完整的解決方案是實現您自己的IComparer,如下所示:

class CustomComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        if (x == y)
            return 0;
        else if (x == "Description B")
            return -1;
        else
            return (x.CompareTo(y));
    }
}

然后你可以像這樣使用它:

var sorted = lst.OrderBy(x => x.Date).ThenBy(x => x.Description, new CustomComparer()).ToList();

這使您可以精確控制您認為在排序中具有更多或更少“重量”的條件。

干杯

只需將該條件添加為中間排序順序:

return ListOfItems.OrderBy(x => x.Date)
                  .ThenBy(x => x.Type == "Description B" ? 0 : 1)
                  .ThenBy(x => x.Type);

如果沒有定義新的排序,您可以嘗試以下方法:

return ListOfItems.OrderByDescending(x => x.Date)
                  .ThenByDescending(x => x.Type == "Description B");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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