Как я сортирую массив пользовательских классов?

У меня есть класс с 2 строками и 1 двойным (сумма).

класс Даритель

  • имя строки
  • строковый комментарий
  • двойная сумма

Теперь у меня есть Массив заполненных Дарителей.
Как я могу отсортировать по Сумме?

13
задан Jon Seigel 18 March 2010 в 20:25
поделиться

7 ответов

Если вы реализуете IComparable Вы можете сделать это следующим образом:

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);
  }
}

Затем вы можете вызвать sort на чем угодно, скажем:

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

The .Sort() вызывает CompareTo() метод, который вы реализовали для сортировки.

Есть также альтернатива лямбда без IComparable:

var donors = new List<Donator>();
//add donors
donors.Sort((a, b) => a.amount.CompareTo(b.amount));
22
ответ дан 1 December 2019 в 19:14
поделиться

Вы также можете использовать делегатов :

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;
}
4
ответ дан 1 December 2019 в 19:14
поделиться

Путем реализации 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
4
ответ дан 1 December 2019 в 19:14
поделиться

Я всегда использую общий список, например

List<Donator> MyList;

, затем я вызываю 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; );
3
ответ дан 1 December 2019 в 19:14
поделиться

Вы можете использовать MyArray.OrderBy (n => n.Amount) при условии, что вы включили Систему. Пространство имен Linq.

2
ответ дан 1 December 2019 в 19:14
поделиться

Вот сортировка без необходимости реализации интерфейса. Здесь используется общий список

    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); });
2
ответ дан 1 December 2019 в 19:14
поделиться

Другой способ - создать класс, реализующий IComparer, а затем передать перегрузку в класс Comparer.

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

Таким образом, у вас могут быть разные классы для каждой конкретной необходимой сортировки. Вы можете создать один для сортировки по имени, сумме или другим параметрам.

0
ответ дан 1 December 2019 в 19:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: