Получить элемент из коллекции по уникальному идентификатору - PullRequest
2 голосов
/ 27 апреля 2010

У меня есть коллекция контактов, которая наследуется от CollectionBase:

public class ContactCollection : CollectionBase{
    //...
}

каждый контакт в коллекции имеет уникальный идентификатор:

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 ]

10 голосов
/ 27 апреля 2010

Для начала я бы изменил CollectionBase и использовал List<T>. CollectionBase был дополнением 1.0, которое больше не нужно из-за Generics. На самом деле, вам может даже не понадобиться ваш класс 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();
3 голосов
/ 27 апреля 2010
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);
1 голос
/ 27 апреля 2010

Почему бы не удалить наследство из CollectionBase и положиться на составной словарь ?

Таким образом, получение по уникальному идентификатору близко к операции O (1) , то есть очень быстро по сравнению с линейным поиском по списку.

Если у каждого контакта также есть список идентификаторов контактов, то их также легко получить из словаря контактов.

Дополнительную информацию о словарях можно найти по адресу: http://dotnetperls.com/dictionary-keys

...