Проверка равенства для двух байтовых массивов
Я проверяю равенство двух байтовых массивов, и мне нужна помощь, потому что у меня есть false, даже если массивы должны быть равны.
В рамках моего отладки я мог видеть, что оба из a1 и b1 равны, но он не входит в цикл while для увеличения i.
public bool Equality(byte[] a1, byte[] b1)
{
int i;
bool bEqual;
if (a1.Length == b1.Length)
{
i = 0;
while ((i < a1.Length) && (a1[i]==b1[i]))
{
i++;
}
if (i == a1.Length)
{
bEqual = true;
}
}
return bEqual;
}
Это всегда возвращает false: (a1[i]==b1[i])
.
Ответы
Ответ 1
Вам нужно где-то добавить возвращаемое значение. Это должно работать:
public bool Equality(byte[] a1, byte[] b1)
{
int i;
if (a1.Length == b1.Length)
{
i = 0;
while (i < a1.Length && (a1[i]==b1[i])) //Earlier it was a1[i]!=b1[i]
{
i++;
}
if (i == a1.Length)
{
return true;
}
}
return false;
}
Но это намного проще:
return a1.SequenceEqual(b1);
В качестве альтернативы вы можете использовать IStructuralEquatable
из .NET 4:
return ((IStructuralEquatable)a1).Equals(b1, StructuralComparisons.StructuralEqualityComparer)
Ответ 2
Чтобы проверить равенство, вы можете просто написать:
var areEqual = a1.SequenceEqual(b1);
Ответ 3
Я бы рекомендовал короткое замыкание, чтобы сделать вещи немного проще, и использовать object.ReferenceEquals
для короткого замыкания для случаев, когда массивы являются одной и той же ссылкой (a1 = b1
):
public bool Equality(byte[] a1, byte[] b1)
{
// If not same length, done
if (a1.Length != b1.Length)
{
return false;
}
// If they are the same object, done
if (object.ReferenceEquals(a1,b1))
{
return true;
}
// Loop all values and compare
for (int i = 0; i < a1.Length; i++)
{
if (a1[i] != b1[i])
{
return false;
}
}
// If we got here, equal
return true;
}
Ответ 4
Это должно работать:
public bool Equality(byte[] a1, byte[] b1)
{
if(a1 == null || b1 == null)
return false;
int length = a1.Length;
if(b1.Length != length)
return false;
while(length >0) {
length--;
if(a1[length] != b1[length])
return false;
}
return true;
}
Ответ 5
Вы должны добавить некоторые операторы возврата:
public bool Equality(byte[] a1, byte[] b1)
{
int i = 0;
if (a1.Length == b1.Length)
{
while ((i < a1.Length) && (a1[i]==b1[i]))
{
i++;
}
}
return i == a1.Length;
}
Или, еще лучше
public bool Equality(byte[] a1, byte[] b1)
{
if(a1.Length != b1.Length)
{
return false;
}
for (int i = 0; i < a1.Length; i++)
{
if (a1[i] != b1[i])
{
return false;
}
}
return true;
}