C Sharp .NET에는 Equals
메서드와 SetEquals
메서드가 있습니다. 차이점은 무엇입니까?집합에 대해 서로 다른 equals 메서드가있는 이유는 무엇입니까?
Java에서 제공되는 첫 번째 생각은 SetEquals
이 아니라 모든 객체에 Equals
메소드를 사용하는 것입니다.
C Sharp .NET에는 Equals
메서드와 SetEquals
메서드가 있습니다. 차이점은 무엇입니까?집합에 대해 서로 다른 equals 메서드가있는 이유는 무엇입니까?
Java에서 제공되는 첫 번째 생각은 SetEquals
이 아니라 모든 객체에 Equals
메소드를 사용하는 것입니다.
SetEquals
은 Equals
과 동일한 계약을 따르지 않습니다. 인수가 ISet<T>
이 아닌 IEnumerable<T>
이므로 대칭이 아닙니다. 이렇게하면 하나만 세트 만있는 동등성을 확인할 수 있습니다.
List<int> intList = new List<int> { 1, 2, 3 };
HashSet<int> intSet = new HashSet<int>(intList);
지금 우리가 사용할 수 있습니다 :
Console.WriteLine(intSet.SetEquals(intList));
을 ...하지만 우리는 List<int>
에 동일한 동작과 다른 모든 IEnumerable<T>
구현을 적용하지 않고 같은 방법으로 Equals
을 구현할 수 없었다 고려하십시오.
다른 세트로 제한하더라도 실제로 평등이란 무엇인가에 대한 흥미로운 질문이 있습니다. 예를 들어 동일한 문자열을 포함하지만 서로 다른 동등 비교자를 갖는 두 개의 HashSet<string>
집합을 생각해보십시오. (아마도 하나는 대소 문자를 구별하고 하나는 그렇지 않습니다.) 그것들은 동등한가요, 그렇지 않은가요? SetEquals
은 너무 일반적인 시도를 피함으로써 그러한 철학적 질문을 피할 수 있습니다.
HashSet<int>
과 SortedSet<int>
은 어떨까요? 그들은 평등 할 수 있었 을까? 그것들은 같은 값을 가질 수 있습니다 만, 하나의 순서는 정의되지 않습니다.
전체적으로 Object.Equals
과 Object.GetHashCode
의 아이디어는 너무 광범위합니다. 종종 유형의 평등을으로하고 싶을 때가 있습니다. 처음에는 객체를 평등하게 비교하는 것이 의미가없는 경우가 있습니다. 이것은 완전히 다른 호언 장담을 쉽게 형성 할 수 있지만, 그 동안에 .NET이 지나치게 광범위한 개념을 콜렉션에 적용하려고 시도하지 않았기 때문에 적어도 기쁩니다. SetEquals
을 잘 정의 된 의미로 사용하는 것이 IMO보다 유용합니다.
Equals
둘 사이의 참조 평등을 검사하면 SetEquals
이 컬렉션의 요소를 검사합니다.
HashSet<T>.SetEquals
은 HashSet에 주어진 IEnumerable<T>
과 동일한 요소가 포함되어 있는지를 결정합니다. 그러나 유형이 다르면 왜 반환해야합니까?
HashSet<int> h = new HashSet<int>();
h.Add(0);
h.Add(1);
int[] ints = new[] { 0, 1, 1, 0 };
h.SetEquals(ints); // true, ignores duplicates because it's a set
h.Equals(ints); // false, correct because not even the same types
MSDN 다음 SetEquals 방법은 중복 된 항목과 다른 매개 변수 요소의 순서를 무시
.....
HasetSet<T>
이후
는 사용
Equals
을 무시하지 않습니다 참조를 비교하는 객체로부터 상속받은 것. 따라서 두 객체가 동일한 참조가 아니면
false
을 반환합니다.
Equals
두 개의 HashSet
이 동일한 객체인지 테스트합니다.SetEquals
은 IEnumerable<T>
을 사용합니다. 이는 무엇입니까? "SetEquals 메서드는 중복 된 항목과 다른 매개 변수의 요소 순서를 무시합니다."그래서 SetEquals
당신은 HashSet에에에 IEnumerable을로드하는 경우, 볼이 소스와 같은 HashSet의를 생성 할 테스트를위한 것입니다.
SetEquals : HashSet의 주어진 을 IEnumerable <T>
와 동일한 요소를 포함하는 경우
검사.
SetEquals 메서드는 두 번째 컬렉션을 중복 요소가없는 것처럼 처리합니다. 중복 요소가있는 경우 두 개의 콜렉션은 여전히 동일한 것으로 간주 될 수 있습니다.
같음 :
같
실제로 참고 시험
List<string> stringList = new List<string> { "a", "b", "c" };
SortedSet<string> stringSet = new SortedSet<string> { "a", "b", "c" };
bool a = stringSet.SetEquals(stringList);
// See if the two collections contain the same elements.
현재 세트 지정된 컬렉션은 동일 유무를 판정
ISet<T>.SetEquals
구현 집단.
Equals
다음은 구현
가 ReferenceEquals 메소드 호출에 상당
object
로부터 상속.
상속 ReferenceEquals 구현,
는, 지정된 Object 인스턴스가 동일한 지 여부를 확인합니다.
는 paticular에서 SetEquals
에 전달 된 IEnumerable<T>
순서가 임의의 순서로, 집합의 모든 구성원의 하나 개 이상의 인스턴스를 가질 수 있습니다, 그리고 SetEquals
아직도 진정한 반환합니다.
그 두 시퀀스를 확인하려면
는 같은 순서 당신이SequenceEqual
확장을 사용할 수 있습니다에서 정확히 같은 멤버가 포함되어 있습니다.
public static void Main(string[] args)
{
Console.WriteLine("Hello World!");
System.Collections.Generic.HashSet<int> setA= new System.Collections.Generic.HashSet<int>();
setA.Add(1);
System.Collections.Generic.HashSet<int> setB= new System.Collections.Generic.HashSet<int>();
setB.Add(1);
Console.WriteLine("Equals method returns {0}", setA.Equals(setB));
Console.WriteLine("SetEquals method returns {0}", setA.SetEquals(setB));
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
출력을 생성합니다 : 이 방법은 거짓 SetEquals 방법 따라서 진정한
(가)와 동일 방법을 반환 참조 평등에 대한 테스트 것 같다 돌려줍니다.
이 의미는 'ISet .SetEquals' http://msdn.microsoft.com/en-us/library/dd412096.aspx? –
Jodrell
나는 차이점이 무엇인지 문서가 꽤 분명하다고 생각합니다. –