对自定义的类的集合的排序有两种方式
一种是让自定义的类实现接口IComparable,然后调用sort()方法
第二种是使用比较器,实现接口IComparer来比较自定义的排序方式
使用比较器可以更灵活,而且多重比较方式并存, 然后在使用的时候根据自己的实际情况来调用不同的比较器
方式一,直接调用Sort方法排序,是使用了Person3实现了接口IComparable的默认方法来排序
/// <summary>
/// 集合的排序
/// </summary>
public static void GetSort()
{
ArrayList list = new ArrayList();
Person3 p1 = new Person3();
p1.Name = "sl";
p1.Age = 20;
Person3 p2 = new Person3();
p2.Name = "lzs";
p2.Age = 2;
Person3 p3 = new Person3();
p3.Name = "ly";
p3.Age = 23;
Person3 p4 = new Person3();
p4.Name = "lnn";
p4.Age = 24;
list.Add(p1);
list.Add(p2);
list.Add(p3);
list.Add(p4);
//方法一
//要么升序要么降序,或者只能按一种规则进行排序
Console.WriteLine(list.Count);
Console.WriteLine("排序之前");
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine(((Person3)list[i]).Name);
}
Console.WriteLine("排序之后:");
//直接调用Sort方法排序,是使用了Person3实现了接口IComparable的默认方法来排序
list.Sort();
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine(((Person3)list[i]).Name);
}
}
}
/// <summary>
/// 方法一
/// 要么升序要么降序,或者只能按一种规则进行排序
/// </summary>
public class Person3 : IComparable
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
/// <summary>
/// 实现接口排序比较的方法
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public int CompareTo(object obj)
{
Person3 p = obj as Person3;
if (p != null)
{
//升序排序
//return this.Age - p.Age;
//降序排序
return p.Age - this.Age;
}
return 0;
}
}
方法二,使用比较器
public class 集合
{
/// <summary>
/// 集合的排序
/// </summary>
public static void GetSort()
{
ArrayList list = new ArrayList();
Person3 p1 = new Person3();
p1.Name = "sl";
p1.Age = 20;
Person3 p2 = new Person3();
p2.Name = "lzs";
p2.Age = 2;
Person3 p3 = new Person3();
p3.Name = "ly";
p3.Age = 23;
Person3 p4 = new Person3();
p4.Name = "lnn";
p4.Age = 24;
list.Add(p1);
list.Add(p2);
list.Add(p3);
list.Add(p4);
//方法二
Console.WriteLine(list.Count);
Console.WriteLine("排序之前");
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine(((Person3)list[i]).Name);
}
//list.Sort();
//这里是使用比较器来对集合进行排序
list.Sort(new PersonNameLengthAsc());
Console.WriteLine("按照名称升序排序之后:");
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine(((Person3)list[i]).Name);
}
list.Sort(new PersonAgeAsc());
Console.WriteLine("按照年龄升序排序之后:");
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine(((Person3)list[i]).Name);
}
list.Sort(new PersonAgeDesc());
Console.WriteLine("按照年龄降序排序之后:");
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine(((Person3)list[i]).Name);
}
}
}
/// <summary>
/// 方法二
/// </summary>
public class Person3
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
/// <summary>
/// 实现接口排序比较的方法
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public int CompareTo(object obj)
{
Person3 p = obj as Person3;
if (p != null)
{
return this.Age - p.Age;
}
return 0;
}
}
/// <summary>
/// 比较Persong类中名称的长度
/// 这是个比较器
/// </summary>
public class PersonNameLengthAsc : IComparer
{
public int Compare(object x, object y)
{
Person3 p1 = x as Person3;
Person3 p2 = y as Person3;
return p1.Name.Length - p2.Name.Length;
}
}
/// <summary>
/// 按照类中年龄的升序
/// </summary>
public class PersonAgeAsc : IComparer
{
public int Compare(object x, object y)
{
Person3 p1 = x as Person3;
Person3 p2 = y as Person3;
return p1.Age - p2.Age;
}
}
/// <summary>
/// 按照类中年龄的降序
/// </summary>
public class PersonAgeDesc : IComparer
{
public int Compare(object x, object y)
{
Person3 p1 = x as Person3;
Person3 p2 = y as Person3;
return p2.Age - p1.Age;
}
}