排序不同类的列表

时间:2014-03-27 14:19:27

标签: c# list sorting generics

我想知道我是否可以针对目前在我的C#项目中排序不同列表的问题创建更通用的方法。

我有ClassA,它包含一个我想在以后用于排序的整数值(年龄)。 我有ClassB,它还包含一个我想用于排序的整数值(id)。

所以目前我正在使用C#List.Sort函数,它需要比较函数,它需要应该比较的类:

List<ClassA> pupils;
pupils.Sort(compareAge);

其中compareAge是:

 int compareAge(ClassA pupilOne, ClassB pupilTwo)
 {
    return pupilOne.Age.CompareTo(pupilTwo.Age);
 }

很好地工作,但现在我想为ClassB使用相同的函数,但它应该采用ClassB并取Id而不是年龄。类似的东西:

List<ClassB> classRooms;
SortByInteger<List<ClassB>(classRooms, id);

List<T> compareByInt<T>(T listToSort, PropertyInfo property)
{
    // ? is this possible?
}

一个注意:由于我也要在移动设备上使用代码,我尽量避免使用LINQ。因此,我可以通过构建C#函数以任何方式完成它,或者我如何自己完成它?

感谢您的建议!

2 个答案:

答案 0 :(得分:6)

你至少可以做到

List<ClassA> pupils;
pupils.Sort((a,b) => a.Age.CompareTo(b.Age));

List<ClassB> classRooms;
classRooms.Sort((a,b) => a.Id.CompareTo(b.Id));

可以保存函数声明。

为了更方便,添加您自己的包装器以调用Sort

static class Tools
{
    static public void SortBy<T,TKey>(this List<T> list, Func<T,TKey> sel) {
        list.Sort((a,b) => Comparer<TKey>.Default.Compare(sel(a), sel(b)));
    } 
}

然后你可以写:

List<ClassA> pupils;
pupils.SortBy(a => a.Age);

List<ClassB> classRooms;
classRooms.SortBy(a => a.Id);

答案 1 :(得分:0)

如何定义界面:

public interface IPupil
{
  int Age { get; set; }
}

然后在你的比较函数中使用它:

   int compareAge(IPupil pupilOne, IPupil pupilTwo)
   {
      return pupilOne.Age.CompareTo(pupilTwo.Age);
   }