Вот общий компаратор, который я использую довольно регулярно:
public class GenericComparer<T> : IComparer<T>
{
public string SortExpression { get; set; }
public int SortDirection { get; set; } // 0:Ascending, 1:Descending
public GenericComparer(string sortExpression, int sortDirection)
{
this.SortExpression = sortExpression;
this.SortDirection = sortDirection;
}
public GenericComparer() { }
#region IComparer<T> Members
public int Compare(T x, T y)
{
PropertyInfo propertyInfo = typeof(T).GetProperty(SortExpression);
IComparable obj1 = (IComparable)propertyInfo.GetValue(x, null);
IComparable obj2 = (IComparable)propertyInfo.GetValue(y, null);
if (SortDirection == 0)
{
return obj1.CompareTo(obj2);
}
else return obj2.CompareTo(obj1);
}
#endregion
}
Чтобы использовать это:
class Program
{
static void Main(string[] args)
{
List<Otomobil> otomobil = new List<Otomobil>();
otomobil.Add(new Otomobil() { Model = 2000, Marka = "mercedes", Renk = "Kırmızı" });
otomobil.Add(new Otomobil() { Model = 2002, Marka = "Opel", Renk = "Yeşil" });
otomobil.Add(new Otomobil() { Model = 2009, Marka = "Audi", Renk = "Mavi" });
otomobil.Sort(new GenericComparer<Otomobil>("Model", 0 /* ASC */));
foreach(var item in otomobil)
{
Console.WriteLine(item.ToString());
}
}
}
Мне нравится этот класс, и я регулярно использую его в ASP.NETпотому что тогда я могу использовать (int)SortDirection.Ascending
вместо 0 в качестве второго параметра, что облегчает его чтение.
Вы можете довольно легко изменить этот класс GenericComparer, чтобы он принимал параметр Func<>
вместо строки всделать его удобным для рефакторинга.Конечно, это будет работать только со свойствами, которые реализуют IComparable.