我想知道我是否可以针对目前在我的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#函数以任何方式完成它,或者我如何自己完成它?
感谢您的建议!
答案 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);
}