我有一个带有对象的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)
答案 0 :(得分:3)
感觉您可以使用联系人作为联系人类型:
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());
答案 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使其与您的代码兼容。