简体   繁体   中英

ListView sorting by two columns

I have a model class 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 :

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.)
  • Reminder5 ( Because flagged )
  • Reminder3 ( Non-flagged, Closer date than the other non-flagged )
  • Reminder4
  • Reminder2

How can I do that?

you can Achieve this using 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 .
    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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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