问题在这句话arr.Sort(new StudentComparer(StudentComparer.CompareType.Grade));
这里只是向sort中传了一个实现了IComparer<Student>的对象,并没有调用该对象的Compare方法啊,就算可以自动调用,也没有指明那个对象是x,那个对象是Y啊,怎么比较呢??详细代码如下:
using System;
using System.Collections.Generic;
/// <summary>
/// 学生类
/// </summary>
public class Student
{
private string name;
// 姓名
public string Name
{
get { return name; }
set { name = value; }
}
private int age;
// 年龄
public int Age
{
get { return age; }
set { age = value; }
} private string grade;
// 年级
public string Grade
{
get { return grade; }
set { grade = value; }
}
//构造函数
public Student(string name, int age, string grade)
{
this.name = name;
this.age = age;
this.grade = grade;
}
public override string ToString()
{
return this.name + "," + this.age.ToString() + "," + this.grade;
}
}接着定义一个用于比较的类,实现IComparer<T>泛型接口:
public class StudentComparer : IComparer<Student>
{
public enum CompareType
{
Name,
Age,
Grade
} private CompareType type;
// 构造函数,根据type的值,判断按哪个字段排序
public StudentComparer(CompareType type)
{
this.type = type;
} #region IComparer<Student> 成员
public int Compare(Student x, Student y)
{
switch(this.type)
{
case CompareType.Name:
return x.Name.CompareTo(y.Name);
case CompareType.Age:
return x.Age.CompareTo(y.Age);
default://case CompareType.Grade:
return x.Grade.CompareTo(y.Grade);
}
} #endregion
}下面就开始排序了:
using System;
using System.Collections.Generic;
public class test
{
public static void Main()
{
List<Student> arr = new List<Student>();
arr.Add(new Student("张三", 7, "一年级"));
arr.Add(new Student("李四", 11, "二年级"));
arr.Add(new Student("王五", 21, "一年级"));
arr.Add(new Student("陈六", 8, "三年级"));
arr.Add(new Student("刘七", 15, "二年级"));
// 调用Sort方法,实现按年级排序
arr.Sort(new StudentComparer(StudentComparer.CompareType.Grade));
// 循环显示集合里的元素
foreach( Student item in arr)
Console.WriteLine(item.ToString()); // 调用Sort方法,实现按姓名排序
arr.Sort(new StudentComparer(StudentComparer.CompareType.Name));
// 循环显示集合里的元素
foreach( Student item in arr)
Console.WriteLine(item.ToString());
}
}
这里只是向sort中传了一个实现了IComparer<Student>的对象,并没有调用该对象的Compare方法啊,就算可以自动调用,也没有指明那个对象是x,那个对象是Y啊,怎么比较呢??详细代码如下:
using System;
using System.Collections.Generic;
/// <summary>
/// 学生类
/// </summary>
public class Student
{
private string name;
// 姓名
public string Name
{
get { return name; }
set { name = value; }
}
private int age;
// 年龄
public int Age
{
get { return age; }
set { age = value; }
} private string grade;
// 年级
public string Grade
{
get { return grade; }
set { grade = value; }
}
//构造函数
public Student(string name, int age, string grade)
{
this.name = name;
this.age = age;
this.grade = grade;
}
public override string ToString()
{
return this.name + "," + this.age.ToString() + "," + this.grade;
}
}接着定义一个用于比较的类,实现IComparer<T>泛型接口:
public class StudentComparer : IComparer<Student>
{
public enum CompareType
{
Name,
Age,
Grade
} private CompareType type;
// 构造函数,根据type的值,判断按哪个字段排序
public StudentComparer(CompareType type)
{
this.type = type;
} #region IComparer<Student> 成员
public int Compare(Student x, Student y)
{
switch(this.type)
{
case CompareType.Name:
return x.Name.CompareTo(y.Name);
case CompareType.Age:
return x.Age.CompareTo(y.Age);
default://case CompareType.Grade:
return x.Grade.CompareTo(y.Grade);
}
} #endregion
}下面就开始排序了:
using System;
using System.Collections.Generic;
public class test
{
public static void Main()
{
List<Student> arr = new List<Student>();
arr.Add(new Student("张三", 7, "一年级"));
arr.Add(new Student("李四", 11, "二年级"));
arr.Add(new Student("王五", 21, "一年级"));
arr.Add(new Student("陈六", 8, "三年级"));
arr.Add(new Student("刘七", 15, "二年级"));
// 调用Sort方法,实现按年级排序
arr.Sort(new StudentComparer(StudentComparer.CompareType.Grade));
// 循环显示集合里的元素
foreach( Student item in arr)
Console.WriteLine(item.ToString()); // 调用Sort方法,实现按姓名排序
arr.Sort(new StudentComparer(StudentComparer.CompareType.Name));
// 循环显示集合里的元素
foreach( Student item in arr)
Console.WriteLine(item.ToString());
}
}
使用指定的比较器对整个 List(T) 中的元素进行排序。备注
如果提供了 comparer,则 List(T) 的元素是使用指定的 IComparer(T) 实现进行排序的。
Sort方法在排序的时候肯定要比较Student大小,这个时候就会自动调用这个对象来比较
根据x升序
y......x
根据y升序
#region IComparer<Student> 成员
public int Compare(Student x, Student y)
{
Console.WriteLine("Invoke: {0} : {1};", x, y);
switch(this.type)
{
case CompareType.Name:
return x.Name.CompareTo(y.Name);
case CompareType.Age:
return x.Age.CompareTo(y.Age);
default://case CompareType.Grade:
return x.Grade.CompareTo(y.Grade);
}
} #endregion
没有指明那个对象是x,那个对象是Y啊,怎么比较呢?
你没有必要关心调用时哪个是x,哪个是y.
这个函数做的事情就是比较x,y,如果x>y,返回1, 如果x==y, 返回0, 如果x<y, 返回-1。
这个接口其实就是让你自己定义两个学生之间的比较规则。
-----------------------------
这个工作是在sort 内部 实现的
它将Compare的事情委托给了IComparer<T>.Compare方法你可以在public int Compare(Student x, Student y)方法里下断点,Debug一下,这样可以看得比较清楚