繁体   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