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
'Nice programing' 카테고리의 다른 글
순간 검색을 날짜 형식으로 변환하는 방법은 무엇입니까? (0) | 2020.11.03 |
---|---|
오류-SqlDateTime 오버플로입니다. (0) | 2020.11.03 |
Android 에뮬레이터에서 파일 시스템의 로컬 파일에 액세스하는 방법은 무엇입니까? (0) | 2020.11.03 |
표현식에는 클래스 유형이 있어야합니다. (0) | 2020.11.03 |
zend 프레임 워크에서 정확한 SQL 쿼리를 인쇄하는 방법은 무엇입니까? (0) | 2020.11.03 |