2010-07-22 4 views
4

나는 이것이 C#에서 IComparer를 사용하기위한 표준인지 여부와 관련하여 질문이 있습니다. Person 객체가 세 개인 상황 (P1, P2 및 P3)이 있다고 가정 해보십시오. P1과 P2에서 전달되는 Compare 메서드를 호출하고 결과가 0이라고 가정 해 보겠습니다. 이는 기본적으로 두 사람을 같은 것으로 분류해야 함을 의미합니다. 이제 P2와 P3에서 전달하는 Compare 메서드를 호출하고 그에 대한 결과도 0이라고합니다. 다시 말하지만, 이것은 두 사람이 평등하다는 것을 의미합니다. 논리적으로 말해서, P1과 P3이 같다고 가정 할 수 있습니다. 그러나 누군가를 구현하기로 결정한 경우 Compare 메소드를 구현할 수 있습니다. 이 경우 P1과 P3도 0을 반환하는 방식으로 구현하는 것이 표준입니까?C# IComparer <T> 표준 사용법의 질문

// Assume these are initialized properly 
Person p1 = null, p2 = null, p3 = null; 
IComparer<Person> comparer = null; 

// Compare person 1 to person 2 and result is 0 
Debug.Assert(comparer.Compare(p1, p2) == 0); 

// Compare person 2 to person 3 and result is 0 
Debug.Assert(comparer.Compare(p2, p3) == 0); 

// Would this be a fair assumption that person 1 and person 3 would also be 0? 
Debug.Assert(comparer.Compare(p1, p3) == 0); 

답변

3

예, 표준이됩니다. 그것의 명시 적에서 IComparable에 대한 언급 :

A.CompareTo (B)가 제로 B.CompareTo (C) 0을 반환 반환하는 경우는, 다음 A.CompareTo (C)는 0을 반환해야합니다.

나는 ICompare에 대해 똑같은 것을 말하는 공식 문서에서 아무것도 찾을 수 없지만 같은 것으로 가정하는 것이 안전하다고 생각합니다.

2

평등 그래서 예 당신이 가정, 그리고 마음에 그와 IComparer를 개발해야한다, 이적입니다 : 여기

내가 부탁 해요 무엇 코드입니다.

그것은 C#을 함께 할 수 없다

Transitivity

4

, 그것은 간단한 수학적 규칙입니다 : 이행 성 : 그래서 http://en.wikipedia.org/wiki/Transitive_relation

, 그래 한마디로.

--- 의견을 추가 정보로 인해 ---

당신이 가서 IComparer에 대한 문서를 읽을 경우 기타에서

Compares two objects and returns a value indicating whether one is less than, 
equal to, or greater than the other. 

을 : http://msdn.microsoft.com/en-us/library/system.collections.icomparer.compare.aspx

는 당신이 볼을 즉, 객체 "a"와 "b"를 비교할 때 비교 메서드를 여러 번 호출 할 때 항상 동일한 결과를 가져야합니다. 그렇지 않은 경우에는 정의되지 않은 동작이 발생하며 정렬 또는 비교를 수행 할 때 해당 함수에 의존 할 수 없습니다.

따라서이 방법을 올바르게 구현하면 전이 규칙이 적용되며 a == c라고 의심 할 여지없이 말할 수 있습니다.

구현 문제에 대한 질문을 명확히하기를 바랍니다.

+0

나는 이것을 알고 있지만, 비교 방법은 이행 규칙이 적용되지 않는 방식으로 구현 될 수 있습니다. Compare 메서드는 새로운 Random()을 반환 할 수 있습니다. 다음(); 전이 규칙은 적용되지 않습니다.그래서 규칙이 적용되는 곳에서 Compare 메소드를 구현하는 표준인지 여부를 묻습니다. – Nick

+1

인터페이스의 적절한 작동을 위해 준수해야하는 계약이 될만큼 충분히 강 대한 대회입니다. 정의되지 않은 행동을하면 계약을 따르지 않습니다 :) – user7116

+0

정말 재밌 네요. 그것은 메소드를 만드는 것과 같습니다. getCurrentTime() {return Time (Random()); }. 그것은 단지 의미가 없습니다. 비교 메소드는 유한하고 항상 동일한 동작을 가져야합니다. 귀하의 예에서 그것은 a.Compare (b) cound가 3 번 연속적으로 호출되면 3 가지 결과를 반환한다는 것을 의미합니다. 나는 이것이 그것이이 기능을위한 것이라고 생각하지 않는다. – Sauleil

3

a == bb == c 인 경우 a == c (동등한 전이 속성) 인 인터페이스 계약의 일부입니다. 이는 코드의 어느 곳에서나 강제되지는 않지만 코드가 올바르게 작동하는 데 필요합니다.