using System;
using System.Collections.Generic;
using System.Text;
namespace Ch12Ex02
{
class Program
{
static void Main(string[] args)
{
//Collection<Animal> animalCollection = new Collection<Animal>();
List<Animal> animalCollection = new List<Animal>();
animalCollection.Add(new Cow("Jack"));
animalCollection.Add(new Chicken("Vera"));
//animalCollection.Sort();//此处编译错误,请问是怎么回事?
foreach (Animal myAnimal in animalCollection)
{
myAnimal.Feed();
}
Console.ReadKey();
}
}
}
原来using System.Collections.Generic;
using System.Text;
namespace Ch12Ex02
{
class Program
{
static void Main(string[] args)
{
//Collection<Animal> animalCollection = new Collection<Animal>();
List<Animal> animalCollection = new List<Animal>();
animalCollection.Add(new Cow("Jack"));
animalCollection.Add(new Chicken("Vera"));
//animalCollection.Sort();//此处编译错误,请问是怎么回事?
foreach (Animal myAnimal in animalCollection)
{
myAnimal.Feed();
}
Console.ReadKey();
}
}
}
对于list<T>来说:
此方法使用类型 T 的默认比较器 Comparer.Default 确定列表元素的顺序。Comparer.Default 属性检查类型 T 是否实现了 IComparable 泛型接口,如果实现了该接口,则使用该实现。否则,Comparer.Default 将检查类型 T 是否实现了 IComparable 接口。如果类型 T 未实现任一接口,则 Comparer.Default 将引发 InvalidOperationException。
也就是说Animal没有实现IComparable 接口,它也不知道怎么帮你排啊?按照什么排啊?
对于范型来说必须指定比较器
可以这样做:
1. 让Animal实现IComparable接口,实现CompareTo方法(假设以name来排序):
class Animal : IComparable<Animal>
{
...
public int CompareTo(Animal other)
{
return name.CompareTo(other.name);
}
}
这样直接调用sort就可以排序 list.Sort();
2.自己写ICompare比较器:
class AnimalCompare : IComparer<Animal>
{
public int Compare(Animal a, Animal b)
{
return a.name.CompareTo(b.name);
}
}
这样使用 list.Sort(new AnimalCompare());
也可以使用 SortedList<key, value>
在Add元素的时候指定一个key,这样SortedList会自动以key的Compare方法进行排序
比如
SortedList<string, Animal> sl = new SortedList<string, Animal>();
sl.Add("animal1", new Animal());
sl.Add("animal2", new Anmial());