c#按联系人状态和名称对列表中的对象进行排序

时间:2012-08-17 14:34:22

标签: c# sorting .net-3.5 instantmessenger

我有一个带有对象的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 个答案:

答案 0 :(得分: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());
    

答案 1 :(得分: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()方法确定它们的类型,并使用适当的代码来处理它们。

如果您无权访问联系人类的实现,可以使用Adapter Design Pattern使其与您的代码兼容。