2013-06-20 2 views
21

C Sharp .NET에는 Equals 메서드와 SetEquals 메서드가 있습니다. 차이점은 무엇입니까?집합에 대해 서로 다른 equals 메서드가있는 이유는 무엇입니까?

Java에서 제공되는 첫 번째 생각은 SetEquals이 아니라 모든 객체에 Equals 메소드를 사용하는 것입니다.

+1

이 의미는 'ISet .SetEquals' http://msdn.microsoft.com/en-us/library/dd412096.aspx? – Jodrell

+2

나는 차이점이 무엇인지 문서가 꽤 분명하다고 생각합니다. –

답변

32

SetEqualsEquals과 동일한 계약을 따르지 않습니다. 인수가 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.EqualsObject.GetHashCode의 아이디어는 너무 광범위합니다. 종종 유형의 평등을으로하고 싶을 때가 있습니다. 처음에는 객체를 평등하게 비교하는 것이 의미가없는 경우가 있습니다. 이것은 완전히 다른 호언 장담을 쉽게 형성 할 수 있지만, 그 동안에 .NET이 지나치게 광범위한 개념을 콜렉션에 적용하려고 시도하지 않았기 때문에 적어도 기쁩니다. SetEquals을 잘 정의 된 의미로 사용하는 것이 IMO보다 유용합니다.

3

Equals 둘 사이의 참조 평등을 검사하면 SetEquals이 컬렉션의 요소를 검사합니다.

10

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을 반환합니다.

5
  • Equals 두 개의 HashSet이 동일한 객체인지 테스트합니다.
  • SetEqualsIEnumerable<T>을 사용합니다. 이는 무엇입니까? "SetEquals 메서드는 중복 된 항목과 다른 매개 변수의 요소 순서를 무시합니다."

그래서 SetEquals 당신은 HashSet에에에 IEnumerable을로드하는 경우, 볼이 소스와 같은 HashSet의를 생성 할 테스트를위한 것입니다.

0

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. 
0

현재 세트 지정된 컬렉션은 동일 유무를 판정 ISet<T>.SetEquals 구현 집단.

Equals 다음은 구현

가 ReferenceEquals 메소드 호출에 상당 object로부터 상속.

상속 ReferenceEquals 구현,

는, 지정된 Object 인스턴스가 동일한 지 여부를 확인합니다.


는 paticular에서 SetEquals에 전달 된 IEnumerable<T> 순서가 임의의 순서로, 집합의 모든 구성원의 하나 개 이상의 인스턴스를 가질 수 있습니다, 그리고 SetEquals 아직도 진정한 반환합니다.


그 두 시퀀스를 확인하려면

는 같은 순서 당신이 SequenceEqual 확장을 사용할 수 있습니다에서 정확히 같은 멤버가 포함되어 있습니다.

0
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 방법 따라서 진정한

(가)와 동일 방법을 반환 참조 평등에 대한 테스트 것 같다 돌려줍니다.

관련 문제