C# сортировка объектов в списке по статусу контакта и имени
У меня есть BindingList с объектами, в которых сохраняется несколько контактов.
internal static BindingList<object> contactList;
У объекта contactList больше типов. SktContact, FBContact, GContact.
Эти контакты я добавляю в событие contactList_Changed в listBox. Но я хочу отсортировать их по статусу (сначала онлайн), а затем по алфавиту.
Я хотел бы подумать вот так:
List<object> contactSorted = new List<object>();
contactSorted = Global.contactList.ToList();
contactSorted.OrderBy((status, name) => Converter.getContactAvailabilityStatus(contactSorted[?]), Converter.getContactName(contactSorted[?]));
contactListBox.Items.AddRange(contactSorted.ToArray());
Но я понятия не имею, как я это делаю. Я не могу перепечатать список объектов и выбрать свойство для заказа.
У меня есть методы, чтобы получить статус и имя от любого объекта. Но как я могу использовать его для сортировки массива контактов?
Я использую собственный рисунок.
private void contactListBox_DrawItem(object sender, DrawItemEventArgs e)
2 ответа
Что вы можете сделать, это реализовать интерфейс для ваших классов контактов.
public interface IContact{
string Name {get;set;}
int Status{get;set;}
}
И измените ваши классовые объявления как
public class SktContact: IContact {
// Implementations
}
...
После этого вы можете объявить свой список с именем интерфейса
var contacts= new List<IContact>():
// Populate contacts to the list
Затем закажите список как
var orderedList = contact.OrderByDescending(c=>c.Status).ThenBy(c=>c.name).ToList():
Затем при использовании элементов списка вы можете использовать метод GetType(), чтобы определить их типы и использовать соответствующий код для их обработки.
Если у вас нет доступа к реализациям классов контактов, вы можете использовать шаблон проектирования адаптера, чтобы сделать их совместимыми с вашим кодом.
Такое ощущение, что вы можете использовать интерфейс для типа контакта:
interface IContact { string Status { get; } string Name { get; } } class FBContact : IContact { public string Status { get { // Implement the status getter } } public string Name { get { // Implement the contact name getter } } }
Тогда просто
var unsortedList = Global.contactList; var contactSorted = unsortedList.Cast<IContact>() .OrderBy(x => x.Status) .ThenBy(x => x.Name); contactListBox.Items.AddRange(contactSorted.ToArray());