如何比较数组的“大小”?
有这样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”。


浙公网安备 33010602011771号