私はフレームワークに配列の平等を与える方法はないと思います。しかし、配列のためにIEqualityComparer<T>
の独自の実装を書くのは難しくありません。例えば、(コンパイルされたが未テスト):
は
public static class ArrayEqualityComparer
{
public static IEqualityComparer<T[]> Create<T>(
IEqualityComparer<T> comparer)
{
return new ArrayEqualityComparer<T>(comparer);
}
}
public sealed class ArrayEqualityComparer<T> : IEqualityComparer<T[]>
{
private static readonly IEqualityComparer<T[]> defaultInstance = new
ArrayEqualityComparer<T>();
public static IEqualityComparer<T[]> Default
{
get { return defaultInstance; }
}
private readonly IEqualityComparer<T> elementComparer;
public ArrayEqualityComparer() : this(EqualityComparer<T>.Default)
{
}
public ArrayEqualityComparer(IEqualityComparer<T> 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
の両方にnull値に対処することを前提としていますインターフェースがそれを保証するものではありませんが、既定の等する比較器は、実際にを行います。 。。あなたはもちろん...私はちょうど今の時間を持っていない、より堅牢に上記のコードを修正することができ、それを扱う)
使用法:
IEqualityComparer<byte[]> x = ArrayEqualityComparer<byte>.Default;
bool equal = x.Equals(bytes1, bytes2);
IEqualityComparer<string[]> y =
ArrayEqualityComparer.Create(StringComparer.OrdinalIgnoreCase);
bool whatever = x.Equals(new[][] { "X", "Y" }, new[] { "x", "y" });
LINQを使用できる場合は、 'keya.SequenceEqual(keyb)'を実行できます。 – Ani
残念ながら、それはモノラルでは利用できません。 – Ali
これは[2つの.Net配列オブジェクト(バイト配列)の比較](http://stackoverflow.com/q/486749/15639)の複製ではありませんか? – MarkJ