如何比较数组的“大小”?

  有这样2个数组,如何比较他们的大小呢?

数组
1 int[] arr1 = new int[]
2 {
3 1,2,3,4
4 };
5 int[] arr2 = new int[]
6 {
7 1,2,3,5
8 };

  如果是NET4.0之前,我想好多人都会拿出数组的元素,一个个的比较。没错,我的想法也是这样的。

  但是NET4.0中,数组基类Array实现了一个新增的接口IStructuralEquatable,从而是所有数据可以直接对比其所拥有的数据是否相等。

public interface IStructuralEquatable
{
bool Equals(object other, IEqualityComparer comparer);
int GetHashCode(IEqualityComparer comparer);

上述还涉及到一个接口IEqualityComparer 这个接口声明如下:

public interface IEqualityComparer
{
bool Equals(object x, object y);
int GetHashCode(object obj);

net4.0 基类库提供好几个直接可用的“集合对象相等比较器”,有2种方式获取这些

1)使用StructuralComparisons类的静态属性StructuralEqualityComparer获取一个StructuralEqualityComparer类型实例的引用,

这一个引用的对象就是一个“集合对象相等比较器”。

2)使用EqualityComparer<T>  类的静态属性Default获取一个net4.0针对泛型T所提供的默认“集合对象相等比较器”对象的引用。

View Code
1 public abstract class EqualityComparer<T> : IEqualityComparer, IEqualityComparer<T>
2 {
3 public static EqualityComparer<T> Default { get; }
4 }

  这样就可以用这种方式判断了:

Console.WriteLine((arr1 as IStructuralEquatable).Equals
(arr2, StructuralComparisons.StructuralEqualityComparer));
Console.WriteLine((arr1
as IStructuralEquatable).
Equals(arr2, EqualityComparer<int>.Default));

  如果2个数组长度不一样。肯定返回是false。否则,逐个比较数组里的元素。如果没发现不同,返回true。

  还有一个问题:我想知道哪个数组大小怎么办?

NET4.0引入了一个新的接口IStructuralComparable,并且Array也实现了此接口。接口定义如下:

public interface IStructuralComparable
{
int CompareTo(object other, IComparer comparer);
}

比较“集合对象大小比较”也有2种方式:

1)通过StructuralComparisons.StructuralComparer获取。

2)通过Comparer<T>.Default属性获取针对特定类型的“集合对象大小比较器”对象。

所以可以写下如下代码:

Console.WriteLine((arr1 as IStructuralComparable).CompareTo
(arr2, StructuralComparisons.StructuralComparer));
Console.WriteLine((arr1
as IStructuralComparable).CompareTo
(arr2,Comparer.Default));

  如果 arr1>arr2 得到“1”,arr1<arr2 得到 “-1”,等于的话是“0”。

posted @ 2011-05-17 17:08  高导  阅读(2466)  评论(1)    收藏  举报