문제

나는 바이트 [] 비교를하고 있습니다.

나는 ==를 시도했지만 이것은 기본과 같다.

byte[] a = {1,2,3};
byte[] b = {1,2,3};
bool equals = a == b; //false
equals = a.Equals(b); //false

확장 방법을 추가하려고 시도했지만 과부하 된 기본 클래스 'Equals는 동일한 인수를 가져 오기 때문에 확장자로 기본 방법으로 이동합니다. 또는 (더 나은) 사용 == 운영자?

내가 실제로 비교해야 할 내용은 다음과 같습니다.

public static bool ContentEquals(this byte[] array, byte[] bytes)
{
    if (array == null || bytes == null) throw new ArgumentNullException();
    if( array.Length != bytes.Length) return false;
    for (int i = 0; i < array.Length; i++)
        if (array[i] != bytes[i]) return false;

    return true;
}
도움이 되었습니까?

해결책

using System.Linq;

byte[] a = {1,2,3}; 
byte[] b = {1,2,3}; 
bool same = a.SequenceEqual(b);

다른 팁

연장 방법으로 작업자 과부하를 할 수는 없습니다. 그것이 작동하지 않는 이유 Equals 방법은 IF입니다 어느 방법은 확장 방법을 사용하지 않고 적용 할 수 있으며,이 방법은 확장 방법을 검사하기 전에 선택됩니다.

당신의 경우에도 Equals 메소드는 인수 유형을 공식 매개 변수 유형으로 변환하는 측면에서 "더 나은"것입니다. 컴파일러는 항상 "정상적인"메소드를 선호합니다. 방법에 다른 이름을 주어야합니다.

그러나 항상 사용할 수 있습니다 Enumerable.SequenceEquals 방법. 나는 짧은 회로가 길이 점검을 믿지 않는다. ICollection<T> 구현). 그래도 항상보다 효율적인 버전을 직접 구현할 수 있습니다. 실제로, 기존 배열 구현을 변경하는 경우 SequenceEquals 또는 ArrayEquals, 괜찮을 것입니다 :

public static bool ArrayEquals(this byte[] array, byte[] bytes)
{
    // I'd personally use braces in all of this, but it's your call
    if (array.Length != bytes.Length) return false;
    for (int i = 0; i < array.Length; i++)     
        if (array[i] != bytes[i]) return false;

    return true;
}

일반적인 것을 만드는 것은 상당히 좋을 것이지만, 비교를 감소시킬 수 없었기 때문에 확실히 약간의 성능이 필요할 것입니다.

public static bool ArrayEquals<T>(this T[] first, T[] second)
{
    // Reference equality and nullity checks for safety and efficiency
    if (first == second)
    {
        return true;
    }
    if (first == null || second == null)
    {
        return false;
    }
    if (first.Length != second.Length)
    {
        return false;
    }        
    EqualityComparer<T> comparer = EqualityComparer<T>.Default;
    for (int i = 0; i < first.Length; i++)
    {
        if (!comparer.Equals(first[i], second[i]))
        {
             return false;
        }
    }
    return true;
}

나는 같은 목적으로 이것을했다 :

static class Global
{
    public static bool ArraysAreEqual(Array arr1, Array arr2)
    {
        if (arr1.Length != arr2.Length)
            return false;

        System.Collections.IEnumerator e1 = arr1.GetEnumerator();
        System.Collections.IEnumerator e2 = arr2.GetEnumerator();

        while(e1.MoveNext() && e2.MoveNext())
        {
            if(!e1.Current.Equals(e2.Current))
                return false;
        }
        return true;
    }
}

그러나 .quals ()는 참조 유형이 동일 할 때 거짓으로 거짓을 반환 할 수도 있습니다 (테스트는 아니지만 StringBuilder로 시도 할 수 있습니다). 내 특별한 경우에는 단순한 값 유형 만 있습니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top