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(), чтобы определить их типы и использовать соответствующий код для их обработки.

Если у вас нет доступа к реализациям классов контактов, вы можете использовать шаблон проектирования адаптера, чтобы сделать их совместимыми с вашим кодом.

  1. Такое ощущение, что вы можете использовать интерфейс для типа контакта:

    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   
            }
        }
    } 
    
  2. Тогда просто

    var unsortedList = Global.contactList;
    var contactSorted = unsortedList.Cast<IContact>()
                                    .OrderBy(x => x.Status)
                                    .ThenBy(x => x.Name);
    
    contactListBox.Items.AddRange(contactSorted.ToArray());
    
Другие вопросы по тегам