比较对象?
我只需做一个简单的比较即
byte[] keya = System.Text.Encoding.ASCII.GetBytes("myFamilyColumn:1"); byte[] keyb = System.Text.Encoding.ASCII.GetBytes("myFamilyColumn:1"); Console.WriteLine(keya == keyb);
但结果是假的,他们的哈希码也不同,我在这里遗漏了什么?
提前致谢 !
我不相信框架中有任何东西会以你想要的方式提供数组相等。 但是,为数组编写自己的IEqualityComparer
实现并不困难。 例如(已编译但未经测试):
public static class ArrayEqualityComparer { public static IEqualityComparer Create( IEqualityComparer comparer) { return new ArrayEqualityComparer (comparer); } } public sealed class ArrayEqualityComparer : IEqualityComparer { private static readonly IEqualityComparer defaultInstance = new ArrayEqualityComparer (); public static IEqualityComparer Default { get { return defaultInstance; } } private readonly IEqualityComparer elementComparer; public ArrayEqualityComparer() : this(EqualityComparer .Default) { } public ArrayEqualityComparer(IEqualityComparer elementComparer) { this.elementComparer = elementComparer; } public bool Equals(T[] x, T[] y) { if (x == y) { return true; } if (x == null || y == null) { return false; } if (x.Length != y.Length) { return false; } for (int i = 0; i < x.Length; i++) { if (!elementComparer.Equals(x[i], y[i])) { return false; } } return true; } public int GetHashCode(T[] array) { if (array == null) { return 0; } int hash = 23; foreach (T item in array) { hash = hash * 31 + elementComparer.GetHashCode(item); } return hash; } }
(注意,这当前假设elementComparer
将处理GetHashCode
和Equals
空值。接口不保证,但默认的相等比较器实际上处理它。你可以修改上面的代码更健壮,当然......我现在没时间。)
用法:
IEqualityComparer x = ArrayEqualityComparer.Default; bool equal = x.Equals(bytes1, bytes2); IEqualityComparer y = ArrayEqualityComparer.Create(StringComparer.OrdinalIgnoreCase); bool whatever = x.Equals(new[][] { "X", "Y" }, new[] { "x", "y" });
keya
和keya
是两个完全独立的对象,恰好包含相同的字节。
如果你想比较两个字符串是否有相同的字符,也许你应该看看像String.Equals
这样的方法?
这个通用扩展应该可以解决问题:
public static class ArrayExtensions { public static bool ElementsEqual(this T[] left, T[] right) where T : IEquatable { if (left == null || right == null) { return !(left == null ^ right == null); } else if (left.Length != right.Length) { return false; } for (int i = 0; i < left.Length; i++) { if (!left[i].Equals(right[i])) { return false; } } return true; } }
数组是引用类型,因此测试相等性检查以查看指针是否相同。 他们不是。
如果要比较元素而不是数组本身,可以import System.Linq
并使用keya.SequenceEqual(keyb)
。