Как отсортировать массив пользовательских классов?
У меня есть класс с 2 строками и 1 двойной (сумма).
класс Donator
- имя строки
- строковый комментарий
- двойное количество
Теперь у меня есть Массив Пожертвователей.
Как я могу сортировать по сумме?
Ответы
Ответ 1
Если вы реализуете IComparable<Donator>
, вы можете сделать это следующим образом:
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()
, который вы выполнили для сортировки.
Также есть альтернатива лямбда без IComparable<T>
:
var donors = new List<Donator>();
//add donors
donors.Sort((a, b) => a.amount.CompareTo(b.amount));
Ответ 2
Используя 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
Ответ 3
Вы также можете использовать 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;
}
Ответ 4
Вы можете использовать MyArray.OrderBy(n => n.Amount)
если вы включили пространство имен System.Linq.
Ответ 5
Я всегда использую общий список, например
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; );
Ответ 6
Вот такой вид, не требующий реализации интерфейса. Это использует общий список
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); });
Ответ 7
Другой способ - создать класс, который реализует IComparer, тогда в классе Comparer есть перегрузка.
http://msdn.microsoft.com/en-us/library/8ehhxeaf.aspx
Таким образом, у вас могут быть разные классы для каждой конкретной сортировки. Вы можете создать сортировку по имени, количеству или другим.