Nice programing

IComparable 인터페이스를 구현하는 방법은 무엇입니까?

nicepro 2020. 11. 3. 19:17
반응형

IComparable 인터페이스를 구현하는 방법은 무엇입니까?


클래스의 인스턴스로 배열을 채우고 있습니다.

BankAccount[] a;
. . .

a = new BankAccount[]
{
    new BankAccount("George Smith", 500m),
    new BankAccount("Sid Zimmerman", 300m)
};

이 배열을 채운 후 잔액을 기준으로 정렬하고 싶습니다. 이를 위해 .NET을 사용하여 각 요소를 정렬 할 수 있는지 확인하고 싶습니다 IComparable.
인터페이스를 사용하여이 작업을 수행해야합니다. 지금까지 다음 코드가 있습니다.

public interface IComparable
{
    decimal CompareTo(BankAccount obj);
}

그러나 이것이 올바른 해결책인지 확실하지 않습니다. 어떤 충고?


IComparable자신을 정의해서는 안됩니다 . 이미 정의되어 있습니다.

오히려, 당신은 필요가 구현 IComparable 당신에 BankAccount클래스입니다.

을 정의한 위치 class BankAccount에서 IComparable인터페이스를 구현하는지 확인하십시오.

그런 다음 BankAccout.CompareTo두 개체의 잔액을 비교하기 위해 씁니다 .


편집하다

public class BankAccount : IComparable<BankAccount>
{
    [...]

    public int CompareTo(BankAccount that)
    {
        if (this.Balance >  that.Balance) return -1;
        if (this.Balance == that.Balance) return 0;
        return 1;
    }
}

Jeffrey L Whitledge의 좋은 대답을 표시하려면 2편집하십시오 .

public class BankAccount : IComparable<BankAccount>
{
    [...]

    public int CompareTo(BankAccount that)
    {
        return this.Balance.CompareTo(that.Balance);
    }
}

배열 파괴적으로 정렬 하시겠습니까? 즉, 실제로 배열의 항목 순서를 변경 하시겠습니까? 아니면 원래 주문을 파괴하지 않고 특정 주문의 항목 목록을 원하십니까?

나는 후자를하는 것이 거의 항상 더 낫다고 제안하고 싶습니다. 비파괴적인 순서에 LINQ를 사용하는 것이 좋습니다. (그리고 "a"보다 더 의미있는 변수 이름을 사용하는 것을 고려하십시오.)

BankAccount[] bankAccounts = { whatever };
var sortedByBalance = from bankAccount in bankAccounts 
                      orderby bankAccount.Balance 
                      select bankAccount;
Display(sortedByBalance);

IComparable 이 CompareTo 정의와 함께 .NET에 이미 존재합니다.

int CompareTo(Object obj)

인터페이스를 생성해서는 안되며 구현해야합니다.

public class BankAccount : IComparable {

    int CompareTo(Object obj) {
           // return Less than zero if this object 
           // is less than the object specified by the CompareTo method.

           // return Zero if this object is equal to the object 
           // specified by the CompareTo method.

           // return Greater than zero if this object is greater than 
           // the object specified by the CompareTo method.
    }
}

대안은 LINQ를 사용하고 IComparable 구현을 모두 건너 뛰는 것입니다.

BankAccount[] sorted = a.OrderBy(ba => ba.Balance).ToArray();

There is already IComparable<T>, but you should ideally support both IComparable<T> and IComparable. Using the inbuilt Comparer<T>.Default is generally an easier option. Array.Sort, for example, will accept such a comparer.


If you only need to sort these BankAccounts, use LINQ like following

BankAccount[] a = new BankAccount[]
{
    new BankAccount("George Smith", 500m),
    new BankAccount("Sid Zimmerman", 300m)
};

a = a.OrderBy(bank => bank.Balance).ToArray();

참고URL : https://stackoverflow.com/questions/4188013/how-to-implement-icomparable-interface

반응형