1

我有一个 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)
4

2 回答 2

3
  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());
    
于 2012-08-17T14:44:51.670 回答
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() 方法来确定它们的类型并使用适当的代码来处理它们。

如果您无权访问联系人类的实现,您可以使用适配器设计模式使它们与您的代码兼容。

于 2012-08-17T14:45:23.107 回答