Qwe Qwe
Qwe Qwe

Reputation: 495

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:

How can I do that?

Upvotes: 1

Views: 161

Answers (2)

Jawad
Jawad

Reputation: 11364

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

Upvotes: 1

Sushant Yelpale
Sushant Yelpale

Reputation: 889

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));

Upvotes: 1

Related Questions