我有一系列继承自CollectionBase的联系人:
public class ContactCollection : CollectionBase{
//...
}
集合中的每个联系人都有一个唯一的ID:
public class Contact{
public int ContactID{
get;
private set;
}
//...
}
我认为我想做的事情如下:
// get the contact by their unique [Contact]ID
Contact myPerson = Contact.GetContactById(15);
// get all contacts for the customer
ContactCollection contacts = customer.GetContacts();
// replaces the contact in the collection with the
// myPerson contact with the same ContactID.
contacts.ReplaceAt(myPerson);
// saves the changes to the contacts and the customer
// customer.Save();
可能有更好的方法......如果是这样,请提出建议。
答案 0 :(得分:10)
对于初学者,我会改变CollectionBase并使用List<T>
。 CollectionBase是一个1.0添加,由于泛型而不再需要。实际上,您可能甚至不需要ContactCollection
类,因为您可能需要的大多数方法已经在泛型实现中实现。
然后你可以使用LINQ:
var item = Collection.FirstOrDefault(x => x.Id == 15);
如果你想保留这些,那么你可以让你的ContactCollection
类成为List<T>
的包装器然后你实际需要编写的代码将是最小的,因为通用的代码最多工作。
Contact myPerson = Contact.GetContactById(15);
// get all contacts for the customer
ContactCollection contacts = customer.GetContacts();
// replaces the contact in the collection with the
// myPerson contact with the same ContactID.
contacts.ReplaceAt(myPerson);
// saves the changes to the contacts and the customer
// customer.Save();
答案 1 :(得分:3)
Contact contact = Contact.GetContactById(15);
ContactCollection contacts = customer.GetContacts();
contacts[contacts.IndexOf(contacts.Find(c => c.Id == contact.Id))] = contact;
这有点好......
int id = 15;
ContactCollection contacts = customer.GetContacts();
int index = users.FindIndex(c => c.Id == id)
if (index >= 0) contacts[index] = Contact.GetContactById(id);
答案 2 :(得分:1)
为什么不从CollectionBase中删除继承,并依赖于合成的Dictionary?
这样,与通过List进行线性搜索相比,通过唯一ID检索接近O(1) operation,即非常快。
如果每个联系人还有一个ContactID列表,那么从联系人词典中检索它们也很容易。
有关字典的更多信息,请访问:http://dotnetperls.com/dictionary-keys