简体   繁体   English

ListView 按两列排序

[英]ListView sorting by two columns

I have a model class Reminder :我有一个模型类Reminder

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

and I also have an enum called ReminderTypes :我还有一个名为ReminderTypes的枚举:

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

I created my list as follows.我创建了我的列表如下。

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;

The sorting rule that should be:排序规则应该是:

  1. Always flagged ones must be on top (flagged ones should be sorted by time)始终标记的必须在顶部(标记的应按时间排序)
  2. Those that are not flagged should be sorted by current time (those close to current time should be on top)那些没有被标记的应该按当前时间排序(那些接近当前时间的应该在上面)

The view that should be in listview:应该在列表视图中的视图:

  • Reminder1 ( Becuse flagged and Closer date than the other flagged.)提醒 1(因为标记了并且比另一个标记的日期更接近。)
  • Reminder5 ( Because flagged )提醒5(因为已标记)
  • Reminder3 ( Non-flagged, Closer date than the other non-flagged ) Reminder3(未标记,比其他未标记的日期更接近)
  • Reminder4提醒4
  • Reminder2提醒2

How can I do that?我怎样才能做到这一点?

you can Achieve this using System.Linq ,您可以使用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));

I would recommend two changes.我会推荐两个改变。

  1. Assign numbers to your enums so they sort how you want them sorted.为您的枚举分配数字,以便它们按照您希望的方式排序。
  2. Use OrderBy and ThenBy to sort your list based on ReminderType , then ReminderDate .使用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));

Output输出

Reminder1
Reminder5
Reminder3
Reminder4
Reminder2

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM