Thanks to visit codestin.com
Credit goes to www.scribd.com

0% found this document useful (0 votes)
174 views6 pages

WPF Sorting with IComparer & IComparable

The document discusses using the IComparer and IComparable interfaces in .NET to customize sorting of object collections in WPF applications. It provides an example of implementing IComparable on an Emp class to sort by Age property. It also demonstrates using IComparer to sort the same Emp objects by Age in descending order or by Name. When both interfaces are implemented, sorting will use the IComparer logic first followed by IComparable. This allows flexible sorting of object collections in various orders.

Uploaded by

Abhi
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
174 views6 pages

WPF Sorting with IComparer & IComparable

The document discusses using the IComparer and IComparable interfaces in .NET to customize sorting of object collections in WPF applications. It provides an example of implementing IComparable on an Emp class to sort by Age property. It also demonstrates using IComparer to sort the same Emp objects by Age in descending order or by Name. When both interfaces are implemented, sorting will use the IComparer logic first followed by IComparable. This allows flexible sorting of object collections in various orders.

Uploaded by

Abhi
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
You are on page 1/ 6

Using IComparer IComparable for Sorting in WPF

IComparer / IComparable are interfaces used to compare two objects. The implementing class has to define the logic for sorting. It provides a way to customize the sort order of a collection. Implementation of IComparable in WPF. Here, we implement the CompareTo method and sort the Emp objects based on Age property. Just create a sample WPF application and paste the code as seen below : Emp class implements IComparable which defines the sort logic. namespace WpfApplication1 { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); List empList = new List(); empList.AddRange(new List(){new Emp { Name = "A", Age = 25, Address = "Test Str eetA" }, new Emp { Name = "A", Age = 26, Address = "Test StreetA1" }, new Emp { Name = "B", Age = 25, Address = "Test StreetB" }, new Emp { Name = "C", Age = 26, Address = "Test StreetC" }, new Emp { Name = "Z", Age = 25, Address = "Test StreetZ" }, new Emp { Name = "D", Age = 26, Address = "Test StreetD" }}); empList.Sort(); } } public class Emp { public string Name { get; set; } public int Age { get; set; } public string Address { get; set; } } public class Emp : IComparable { public string Name { get; set; } public int Age { get; set; } public string Address { get; set; } #region IComparable Members public int CompareTo(Emp other) { // Sort based on Age

if (this.Age > other.Age) { return 1; } else if (other.Age > this.Age) return -1; else return 0; } #endregion } }

Note: List test = new List(); test.Add("B"); test.Add("C"); test.Add("A"); test.Sort(); This will work because by default List and Array implement IComparable. But the example below won't work. public class Emp { public string Name { get; set; } } // Sorting using IComparable based Age ascending order List empList = new List(); empList.AddRange(new List(){new Emp { Name = "C25"}, new Emp { Name = "B35"}, new Emp { Name = "A15"}}); empList.Sort(); C# compiler is not smart enough to figure out which instance of type "Emp" should come first etc. IComparer interface: But sometimes, we may need to sort a list of objects when the class does not implement IComparable<> interface and also we may need various kinds of sorting on that class like: 1. Sort Emp by Age in Ascending Order 2. Sort Emp by Age in Descending Order 3. Sort Emp by Name To solve this problem, .NET provides a special interface called IComparer<> which has a method Compare(), takes two object parameters X, Y and returns an int. Use of IComparer<> interface tells List how exactly you want to sort.

namespace WpfApplication1 { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); // Sorting using IComparable based Age ascending order List empList = new List(); empList.AddRange(new List(){new Emp { Name = "A25", Age = 25, Address = "Te st StreetA25" }, new Emp { Name = "B35", Age = 35, Address = "Test StreetB3 5" }, new Emp { Name = "C15", Age = 15, Address = "Test StreetC1 5" }, new Emp { Name = "D45", Age = 45, Address = "Test StreetD4 5" }, new Emp { Name = "E5", Age = 5, Address = "Test StreetE5" } }); // Default sort as defined by IComparable empList.Sort(); foreach (dynamic emp in empList) { string listTemp = emp.Name + "-" + emp.Age + "-" + emp.Address; myListBox.Items.Add(listTemp); } // Create IComparer instance Emp_SortByAgeByDescendingOrder descSort = new Emp_SortByAgeByDescending Order(); // Specify the type empList.Sort(descSort); foreach (dynamic emp in empList) { string listTemp = emp.Name + "-" + emp.Age + "-" + emp.Address; myListBox1.Items.Add(listTemp); } } } public class Emp : IComparable { public string Name { get; set; } public int Age { get; set; } public string Address { get; set; } public int CompareTo(Emp other) { // Sort based on Age if (this.Age > other.Age) {

return 1; } else if (other.Age > this.Age) return -1; else return 0; } } class Emp_SortByAgeByDescendingOrder : IComparer { #region IComparer Members public int Compare(Emp x, Emp y) { if (x.Age < y.Age) return 1; else if (x.Age > y.Age) return -1; else return 0; } #endregion } class Emp_SortByName : IComparer { #region IComparer Members public int Compare(Emp x, Emp y) { return string.Compare(x.Name, y.Name); } #endregion } } Special case : If we have both IComparer and IComparable implemented Sort will take place based on IComparer logic first and then followed by IComparable logic. public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); List empList = new List(); empList.AddRange(new List(){new Emp { Name = "A", Age = 25, Address = "Test Str eetA25" }, new Emp { Name = "A", Age = 35, Address = "Test StreetB35" }, new Emp { Name = "B", Age = 15, Address = "Test StreetC15" }, new Emp { Name = "B", Age = 45, Address = "Test StreetD45" }, new Emp { Name = "C", Age = 5, Address = "Test StreetE5" }}); // Create IComparer instance // IComparer sorts by Name asc // IComparable sorts by Age desc // Sort should be Name asc and Age desc Emp_SortByName descSort = new Emp_SortByName();

} }

// Specify the type empList.Sort(descSort); foreach (dynamic emp in empList) { string listTemp = emp.Name + "-" + emp.Age + "-" + emp.Address; myListBox1.Items.Add(listTemp); }

public class Emp : IComparable { public string Name { get; set; } public int Age { get; set; } public string Address { get; set; } public int CompareTo(Emp other) { // Sort based on Age if (this.Age > other.Age) { return 1; } else if (other.Age > this.Age) return -1; else return 0; } } class Emp_SortByName : IComparer { #region IComparer Members public int Compare(Emp x, Emp y) { return string.Compare(x.Name, y.Name); } #endregion } Happy Reading...
Comment Request!
Thank you for reading this post. Please post your feedback, question, or comments about this post Here.

You might also like