2010-03-18 9 views
13

2 개의 문자열과 1 개의 double (양)이있는 클래스가 있습니다.사용자 정의 클래스 배열을 정렬하려면 어떻게합니까?

클래스 기부자

  • 문자열 이름
  • 문자열 코멘트
  • 이중 양

지금은 기부자의 배열이 가득 차 있습니다.
금액으로 어떻게 정렬 할 수 있습니까?

+3

@Jeff 오, 그는 확실히 'IndividualHumanBeingWhoDonated'를 사용하고 싶습니다. –

+6

기부자는 도넛의 감정가입니다. – DRBlaise

+1

중복 : http://stackoverflow.com/questions/1301822/how-to-sort-an-array-of-object-by-a-specific-field-in-c http://stackoverflow.com/questions/ 1812044/how-to-sort-an-object-in-visual-c http : // stackoverflow.com/questions/1211617/sort-an-array of-strong-typed-object-of-the-object-of-the-object-c –

답변

22

당신은 이런 식으로 작업을 수행 할 수 있습니다

public class Donator :IComparable<Donator> 
{ 
    public string name { get; set; } 
    public string comment { get; set; } 
    public double amount { get; set; } 

    public int CompareTo(Donator other) 
    { 
    return amount.CompareTo(other.amount); 
    } 
} 
그런 다음, 종류에 당신이 원하는대로 호출 할 수 있습니다

말 :

var donors = new List<Donator>(); 
//add donors 
donors.Sort(); 

.Sort()은 당신이 구현 CompareTo() 메소드를 호출 정렬. 내가 MyList.Sort

MyList.Sort(delegate (Donator a, Donator b) { 
    if (a.Amount < b.Amount) return -1; 
    else if (a.Amount > b.Amount) return 1; 
    else return 0;); 
+0

IComparer를 구현하는 클래스가 더 나은 방법 일 것입니다. – eschneider

+2

@eschneider - 이것은 거의 항상 간단한 일입니다. 그게 "더 나은"것이 어때? –

+0

다양한 방법으로 정렬해야 할 가능성이 있습니다. DonorAmountComparer, DonorLastNameComparer, DonorAmountThenLastNameComparer. – eschneider

4

IComparable을 구현 한 다음 Array.Sort을 사용하십시오.

public class Donator : IComparable { 
    public string name; 
    public string comment; 
    public double amount; 

    public int CompareTo(object obj) { 
     // throws invalid cast exception if not of type Donator 
     Donator otherDonator = (Donator) obj; 

     return this.amount.CompareTo(otherDonator.amount); 
    } 
} 

Donator[] donators; // this is your array 
Array.Sort(donators); // after this donators is sorted 
+0

람다 식을 전달할 수도 있습니다. 새로운 클래스 –

+0

을 만들려고 시도했지만, 실제로 어떻게 정렬합니까? – Kovu

+1

.Net 2.0에는 없습니다. 그는 할 수 없습니다. – AxelEckenberger

2

당신은 당신이의 System.Linq 네임 스페이스를 포함 시켰 제공 MyArray.OrderBy(n => n.Amount) 를 사용할 수 있습니다. 당신이 IComparable<Donator>을 구현하는 경우

+0

myArray = myArray.orderby ... 시도했습니다 : 오류 : Fehler "DongleDonatorSite.Donator []"ist nicht möglich에서 "System.Linq.IOrderedEnumerable "유형의 암시 적 해석이 가능합니다. – Kovu

+0

.ToArray()를 사용하여 열거 형을 배열로 되돌릴 수 있습니다. –

+0

끝에'.ToArray()'를 추가하거나 결과를 할당 할 변수의 유형을 변경하고자 할 수 있습니다. 그런데 대부분의 경우 배열 사용을 중단하고 일반 목록을 사용하는 것이 더 실용적이지만 성능이 문제가되지는 않습니다. –

2

난 항상 일반적인 목록을 사용

또한 IComparable<T>없이 람다 대안있다 delegates :

도 사용하십시오.
class Program 
{ 
    static void Main(string[] args) 
    { 
     List<Donor> myDonors = new List<Donor>(); 
     // add stuff to your myDonors list... 

     myDonors.Sort(delegate(Donor x, Donor y) { return x.amount.CompareTo(y.amount); }); 
    } 
} 

class Donor 
{ 
    public string name; 
    public string comment; 
    public double amount; 
} 
+0

a.Amount.CompareTo (b.Amount) – Ruben

+0

과 동일합니다. 또한, 내 방법을 사용하면 금액을 기준으로 정렬하고, 이름이 같은지 등의 추가 논리를 추가 할 수 있습니다. CompareTo는이 경우에 더 간단하며, 내 예제는보다 흥미로운 정렬이 필요한 경우에만 유용합니다 논리. –

+0

물결 모양이없는 것 같습니다. –

4

당신이 할 수있는 전화

List<Donator> MyList; 

다음 예를 들어,

var donors = new List<Donator>(); 
//add donors 
donors.Sort((a, b) => a.amount.CompareTo(b.amount)); 
2

여기에 인터페이스를 구현하지 않고도 정렬이 있습니다. 이것은 일반 목록 또 다른 방법은 IComparer를 구현하는 클래스를 만드는 것입니다

List<Donator> list = new List<Donator>(); 
    Donator don = new Donator("first", "works", 98.0); 
    list.Add(don); 
    don = new Donator("first", "works", 100.0); 
    list.Add(don); 
    don = new Donator("middle", "Yay", 101.1); 
    list.Add(don); 
    don = new Donator("last", "Last one", 99.9); 
    list.Add(don); 
    list.Sort(delegate(Donator d1, Donator d2){ return d1.amount.CompareTo(d2.amount); }); 
0

을 사용하고, 후 비교 자 클래스에 전달하는 과부하가있다.

http://msdn.microsoft.com/en-us/library/8ehhxeaf.aspx

이 방법 당신은 필요한 각각의 특정 종류의 서로 다른 클래스를 가질 수있다. 이름, 금액 또는 다른 이름으로 정렬 할 수 있습니다.

관련 문제