проверка наличия списка <MyObject>в коллекции - PullRequest
2 голосов
/ 12 октября 2009

обычно с хеш-таблицей я делаю:

if(!myHash.Contains(someId))
{
   // insert to hash
}

Если у меня есть список, как я могу проверить, используя содержимое?

Прямо сейчас я просто создаю хэш-таблицу идентификаторов пользователей и проверяю это, но есть ли способ просто использовать список?

Ответы [ 5 ]

7 голосов
/ 12 октября 2009

Вы можете использовать List<T>.Contains - просто знайте, что это будет линейный поиск, т. Е. O (N) вместо O (1) из HashMap. Если ваш список не слишком большой, вряд ли это будет большой проблемой. Конечно, вам все еще нужно, чтобы элементы переопределяли Equals соответствующим образом, если вы не удовлетворены ссылочной идентификацией.

Если у вас есть большой список, для которого вам нужно будет выполнять повторные проверки содержимого, вы можете просто создать HashSet<T> из существующего списка. Если вы собираетесь много манипулировать списком по ходу дела, вы можете инкапсулировать как список, так и набор в свою собственную коллекцию. Вам нужно будет решить, какую семантику вы хотите - что бы вы хотели, если бы вы добавили один и тот же идентификатор дважды? Следует ли игнорировать второй вызов? Если вы можете уйти, не делая этого, тем лучше:)

4 голосов
/ 12 октября 2009

Есть ли причина, по которой List.Contains не работает?

if ( !myList.Contains(someId) ) {
  ...
}

Если идентификатор является свойством в MyObject, вы можете сделать следующее

if ( !myList.Any(x => x.Id == someId) ) {
  ...
}
1 голос
/ 12 октября 2009

Вы также можете сделать

list.Find(x => x.Id == someOtherValue) != null

если вам нужна поддержка в C # 2.0, это можно записать так:

list.Find(delegate(Agent x) { return x.Id == someOtherValue; }) != null

Для LINQ это также можно сделать с помощью

bool listContainsId = (from item in list
                            where item.Id == someOtherValue
                            select item).Any();
1 голос
/ 12 октября 2009

Вы можете использовать метод List.Contains . Однако обратите внимание, что этот метод выполняет линейный поиск и поэтому работает медленнее, чем Hashtable. Если у вас большое количество пользователей, рассмотрите возможность использования HashSet .

0 голосов
/ 12 октября 2009

Рассматриваете ли вы поместить его в SortedList, тогда поиск будет бинарный поиск. Этот метод является операцией O (log n), где n равно Count.

http://msdn.microsoft.com/en-us/library/system.collections.sortedlist.contains.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...