문제

구현 해야하는 이러한 인터페이스를 알아 내려고 노력하고 있습니다. 그들은 둘 다 본질적으로 똑같은 일을합니다. 언제 다른 하나를 사용합니까?

도움이 되었습니까?

해결책

글쎄 그들은 그렇지 않습니다 상당히 같은 것 IComparer<T> 두 개의 다른 객체를 비교할 수있는 유형에서 구현됩니다. IComparable<T> 동일한 유형의 다른 인스턴스와 비교할 수있는 유형에서 구현됩니다.

나는 사용하는 경향이있다 IComparable<T> 다른 사례가 어떻게 관련되어 있는지 알아야 할 때 this 사례. IComparer<T> 컬렉션을 정렬하는 데 유용합니다 IComparer<T> 비교 외부에 서 있습니다.

다른 팁

사용 IComparable<T> 클래스에 본질적인 비교가있을 때.

사용 IComparer<T> 클래스의 고유 비교 이외의 비교 방법을 원할 때.

그것은 엔티티에 따라 다릅니다. 예를 들어 "학생"과 같은 수업의 경우 이름을 기준으로 비교할 수있는 것이 합리적입니다.

class Student : IComparable 
{
    public string Name { get; set; }
    public int MathScore { get; set; }
    public int EnglishScore { get; set; }

    public int TotalScore 
    {
        get
        {
            return this.MathScore + this.EnglishScore; 
        }
    }

    public int CompareTo(object obj)
    {
        return CompareTo(obj as Student);  
    }

    public int CompareTo(Student other)
    {
        if (other == null)
        {
            return 1;
        }
        return this.Name.CompareTo(other.Name);  
    }
}

그러나 교사 'A'가 MathScore를 기반으로 학생들을 비교하고자하는 경우, 교사 'B'는 EnglishScore를 기반으로 학생들을 비교하려고합니다. ICOMPARER를 별도로 구현하는 것이 좋습니다. (전략 패턴처럼)

class CompareByMathScore : IComparer<Student>
{
    public int Compare(Student x, Student y)
    {
        if (x.MathScore > y.MathScore)
          return 1;
        if (x.MathScore < y.MathScore)
          return -1;
        else
          return 0;
    }
}

그것은 모두 당신의 유형이 변한 지 여부에 달려 있습니다. 당신은해야합니다 비전 적용 불가능한 유형에서 IComplayable을 구현하십시오. IComparty를 구현하는 경우 ==,! =, <및> 연산자와 함께 Equals를 재정의해야합니다 (CO1036 경고 CODE 분석 경고 참조).

Dave G를 인용합니다 이 블로그 게시물:

그러나 정답은 객체가 변이 가능한 경우 IComparer 대신 ICOMPARER를 구현하고 ICOMPARER의 인스턴스를 필요할 때 기능을 분류하는 것입니다.

Icomparer는 해당 시점에서 정렬하는 데 사용되는 일회용 객체이므로 객체는 원하는 의미를 가질 수 있습니다. 또한, Equals, gethashcode, 또는 ==를 필요로하지 않거나 제안하지도 않습니다. 원하는 방식으로 자유롭게 정의 할 수 있습니다.

마지막으로, 다른 필드 또는 다른 규칙으로 정렬하기 위해 유형의 여러 ICOMPARER를 정의 할 수 있습니다. 이것은 하나의 정의에 붙어있는 것보다 훨씬 유연합니다.

요컨대 : 값 유형에 icomparty를 사용하고 참조 유형에는 ICOMPARER를 사용하십시오.

이야기를 통한 간단한 설명

고등학교 농구. 팀을위한 학교 야드 선택입니다. 팀에서 가장 키가 크고 최고/빠른 사람들을 얻고 싶습니다. 내가 어떻게해야하나요?

ICOMPARER 인터페이스 - 두 사람을 비교하십시오

  • 이것은 내가 줄을 서서 두 사람을 비교할 수있게 해줍니다 ......... 그것은 기본적으로 그것입니다. 프레드 vs 존 .......... 나는 그들을 인터페이스를 구현하는 콘크리트 클래스에 던져 넣습니다. Compare(Fred, John) 그리고 누가 더 나은지를 뱉어냅니다.

Icompaontable은 어떻습니까? - 다른 사람과 자신을 비교하십시오

최근에 FB에 있었습니까? 당신은 다른 사람들이 멋진 일을하는 것을 봅니다 : 세상을 여행하고, 발명품을 만들고, 나는 멋진 일을하고있는 동안 우리가하는 일은 iComplayable 인터페이스를 사용하는 것입니다.

  • 우리는 현재 인스턴스 (자신)를 동일한 유형 (사람) 인 다른 객체 (다른 사람)와 비교합니다.

비교 클래스는 어떻습니까?

비교 클래스는 ICOMPARER 인터페이스를 구현하는 추상 기본 클래스입니다. 구체적인 구현을 위해이 클래스에서 파생해야합니다. 어쨌든 Microsoft는 ICOMPARER 인터페이스를 구현하는 대신 비교 클래스를 사용하는 것이 좋습니다.

ICOMPARER 인터페이스를 구현하는 대신 비교 클래스에서 파생하는 것이 좋습니다. 비교 클래스는 icomparer.compare 메소드의 명시 적 인터페이스 구현과 객체의 기본 비교를 가져 오는 기본 속성을 제공하기 때문입니다.

요약

  • Icomparer- 두 가지를 정렬하고 비교하십시오.
  • Icompartion- FB에서 다른 사람들과 자신을 비교하십시오.

이야기가 당신이 기억하는 데 도움이되기를 바랍니다.

다른 사람들이 말했듯이, 그들은 같은 일을하지 않습니다.

어쨌든 요즘 나는 Icomparer를 사용하지 않는 경향이 있습니다. 내가 왜 그럴까? 그 책임 (두 개체를 비교하는 데 사용되는 외부 엔터티)은 LINQ의 대부분의 방법이 작동하는 방식과 유사하게 Lambda 표현으로 훨씬 더 깨끗하게 처리 될 수 있습니다. 물체를 인수로 비교하기 위해 객체를 가져다가 부를 반환하는 빠른 람다를 작성하십시오. 또한 객체가 고유 한 내재 비교 작업을 정의하면 대신에 icompayable을 구현할 수 있습니다.

Icomparable은 물체를 다른 물체와 비교할 수 있다고 말합니다. Icomparer는 두 항목을 비교할 수있는 객체입니다.

Icomparer는 배열을 정렬하는 데 사용되는 인터페이스이며,이 인터페이스는 클래스가 비교 (t x, t y) 메소드를 구현하여 두 객체를 비교합니다. 이 인터페이스를 구현 한 클래스의 인스턴스는 배열의 정렬에 사용됩니다.

Icomparable은 인터페이스가 동일한 유형의 두 객체를 비교 해야하는 유형에서 구현됩니다.이 비교 가능한 인터페이스는 클래스가 다음 메소드 비교 (t obj)를 구현하도록합니다.

iequalitycomparer는 객체가 동일 여부에 관계없이 객체를 찾는 데 사용되는 인터페이스입니다. 이제 컬렉션에서 객체의 별개를 찾아야하는 샘플에서 이것을 볼 수 있습니다. 이 인터페이스는 메소드 동등한 메소드를 구현합니다 (t obj1, t obj2)

이제 우리는이 수업을 바탕으로 컬렉션을 만들어야하는 직원 수업이 있습니다. 이제 우리는 다음과 같은 요구 사항이 있습니다.

배열 클래스 2를 사용하여 배열을 정렬합니다. LINQ를 사용하여 컬렉션이 필요합니다 : 중복을 제거하고, 더 높게 주문하고, 하나의 직원 ID를 제거하십시오.

abstract public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address { set; get; }
}

public enum SortType
{
    ByID,
    BySalary
}

공개 클래스 EmployeeIdSorter : ICOMPARER {public int Compar (Employee X, Employee y) {if (x.id <y.id) return 1; else if (x.id> y.id) return -1; 그렇지 않으면 반환 0; }}

    public class EmployeeSalarySorter : IComparer<Employee>
    {
        public int Compare(Employee x, Employee y)
        {
            if (x.Salary < y.Salary)
                return 1;
            else if (x.Salary > y.Salary)
                return -1;
            else
                return 0;
        }
    }

자세한 내용은 아래에 있습니다http://dotnetvisio.blogspot.in/2015/12/usage-of-icomparer-icompable-and.html

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