用方括号声明数组是C#中使用Array类的表示法。在后台使用CE语法,会创建一个派生自抽象基类Array的新类。这样,就可以使用Array类为每个C#数组定义的方法和属性了。
创建数组
Array类是一个抽象类,所以不能使用构造方法类创建数组。但除了可以使用C#语法创建数组实例之外,还可以使用静态方法CreateInstance()创建数组。如果实现不知道元素的类型,该静态方法就非常有用,因为类型可以作为参数进行输入。
复制数组
因为数组是引用类型,所以键过一个数组变量赋予零一数组变量,就会得到连个引用同一个数组的变量。而复制数组,会使数组实现ICloneable接口。这个接口定义的Clone()方法会创建数组的浅拷贝。
排序
Array类使用Quicksort算法对数组中的元素进行排序。Array.Sort()方法需要数组中的元素实现IComparable接口。
IComparable接口仅定义了一个方法CompareTo()
如果要比较的对象相等,返回0
如果该实例排在参数对象前面,返回负数
如果该实例派生参数对象后面,返回正数
如果需要排序的元素类型已经定义好了排序方法(即已经实现了IComparable接口),但已定义的这种排序方式不能满足现有的需要,那么就需要使用Array.Sort()f方法的其它版本(public static void Sort<T>(T[] array, IComparer<T> comparer); 与 public static void Sort(Array array, IComparer comparer);)。这两个版本需要传入一个比较器作为参数,因此,需要实现继承自IComparer接口或IComparer<T>接口的比较器。这两个接口定义了方法Compare(),其返回值与IComparable接口的CompareTo()方法类似。
public class Person : IComparable<Person>
{
public string FirstName { get; set; }
public string LastName { get; set; }
public override string ToString() => $"{FirstName} {LastName}";
public int CompareTo(Person other)
{
if (other == null)
throw new ArgumentNullException("other");
System.Console.WriteLine($"比较方法(IComparable<T>):{this,-15} vs {other,-15}");
int result = LastName.CompareTo(other.LastName);
if (result == 0)
{
result = FirstName.CompareTo(other.FirstName);
}
return result;
}
}
public enum PersonCompareType
{
FirstName,
LastName
}
public class PersonComparer : IComparer<Person>
{
private PersonCompareType _compareType;
public PersonComparer(PersonCompareType compareType)
{
_compareType = compareType;
}
public int Compare(Person x, Person y)
{
if (x == null) throw new ArgumentNullException("x");
if (y == null) throw new ArgumentNullException("y");
System.Console.WriteLine($"比较方法(IComparer<T>) :{x,-15} vs {y, -15}");
switch (_compareType)
{
case PersonCompareType.FirstName:
return x.FirstName.CompareTo(y.FirstName);
case PersonCompareType.LastName:
return x.LastName.CompareTo(y.LastName);
default:
throw new ArgumentException("unexpected compare type");
}
}
}
static void Main()
{
var persons = new Person[]
{
new Person { FirstName="Damon", LastName="Hill" },
new Person { FirstName="Niki", LastName="Lauda" },
new Person { FirstName="Ayrton", LastName="Senna" },
new Person { FirstName="Graham", LastName="Hill" }
};
Array.Sort(persons);
WriteLine("======================================================");
Array.Sort(persons, new PersonComparer(PersonCompareType.FirstName));
Console.ReadKey();
}
结果如下:
有结果可知,在使用IComparer接口进行比较排序时,即使元素类型中已实现了IComparable接口也不会使用。