通过唯一ID从集合中获取项目

时间:2010-04-27 14:57:24

标签: c# asp.net c#-3.0 collections

我有一系列继承自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();

可能有更好的方法......如果是这样,请提出建议。

3 个答案:

答案 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