簡體   English   中英

ListView 按兩列排序

[英]ListView sorting by two columns

我有一個模型類Reminder

public class Reminder 
{
    public string ReminderName { get; set; }
    public ReminderTypes ReminderType { get; set; }
    public DateTime ReminderDate { get; set; }
}

我還有一個名為ReminderTypes的枚舉:

public enum ReminderTypes 
{
    REMINDER_NORMAL,
    REMINDER_FLAGGED,
    REMINDER_IMPORTANT,
    REMINDER_WARNING
}

我創建了我的列表如下。

List<Reminder> reminders = new List<Reminder> {
    new Reminder{ ReminderName = "Reminder1",  ReminderType = ReminderTypes.REMINDER_FLAGGED , ReminderDate = DateTime.Now.AddDays(5)
    },
    new Reminder{ ReminderName = "Reminder2", ReminderType = ReminderTypes.REMINDER_IMPORTANT, ReminderDate = DateTime.Now.AddDays(10).AddHours(5).AddMinutes(50)
    },
    new Reminder{ ReminderName = "Reminder3", ReminderType = ReminderTypes.REMINDER_NORMAL, ReminderDate = DateTime.Now.AddHours(5)
    },
    new Reminder{ ReminderName = "Reminder4", ReminderType = ReminderTypes.REMINDER_WARNING, ReminderDate = DateTime.Now.AddDays(10).AddHours(5).AddMinutes(49)
    },
    new Reminder{ ReminderName = "Reminder5", ReminderType = ReminderTypes.REMINDER_FLAGGED, ReminderDate = DateTime.Now.AddDays(5).AddHours(5)
    },
};
ListViewReminder.ItemsSource = reminders;

排序規則應該是:

  1. 始終標記的必須在頂部(標記的應按時間排序)
  2. 那些沒有被標記的應該按當前時間排序(那些接近當前時間的應該在上面)

應該在列表視圖中的視圖:

  • 提醒 1(因為標記了並且比另一個標記的日期更接近。)
  • 提醒5(因為已標記)
  • Reminder3(未標記,比其他未標記的日期更接近)
  • 提醒4
  • 提醒2

我怎樣才能做到這一點?

您可以使用System.Linq實現這一點,

var Result = reminders
            .Where(e => e.ReminderType == ReminderTypes.REMINDER_FLAGGED)
            .OrderBy(e => e.ReminderDate).ToList();
Result.AddRange(reminders
    .Where(e => e.ReminderType != ReminderTypes.REMINDER_FLAGGED)
    .OrderBy(e => e.ReminderDate));

我會推薦兩個改變。

  1. 為您的枚舉分配數字,以便它們按照您希望的方式排序。
  2. 使用OrderByThenBy根據ReminderTypeReminderDate對列表進行排序。
    public enum ReminderTypes
    {
        REMINDER_FLAGGED = 0,
        REMINDER_NORMAL = 1,
        REMINDER_WARNING = 2,
        REMINDER_IMPORTANT = 3
    }
    List<Reminder> ordered = reminders.OrderBy(x => x.ReminderType).ThenBy(x => x.ReminderDate).ToList();
    ordered.ForEach(x => Console.WriteLine(x.ReminderName));

輸出

Reminder1
Reminder5
Reminder3
Reminder4
Reminder2

暫無
暫無

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

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