Эффективный способ поиска объекта из списка объектов в c # - PullRequest
2 голосов
/ 15 апреля 2011

У меня есть список, который содержит более 75 тысяч объектов. Для поиска элемента из списка я использую следующий код.

from nd in this.m_ListNodes
where
   nd.Label == SearchValue.ToString()
   select
   nd;

Этот код эффективен?

Ответы [ 2 ]

11 голосов
/ 15 апреля 2011

Как часто вам нужно искать в том же списке?Если вы выполняете поиск только один раз, вы можете также выполнить прямой линейный поиск - хотя вы можете сделать свой текущий код немного более эффективным, вызвав SearchValue.ToString() один раз перед запросом.

Если вы собираетесь выполнять этот поиск в одном и том же списке несколько раз, вам следует либо создать Lookup, либо Dictionary:

var lookup = m_ListNodes.ToLookup(nd => nd.Label);

или

var dictionary = m_ListNodes.ToDictionary(nd => nd.Label);

Использоватьсловарь, если на ярлык ровно одна запись;используйте поиск, если может быть несколько совпадений.

К используйте this, для поиска:

var results = lookup[SearchValue.ToString()];
// results will now contain all the matching results

или для словаря:

WhateverType result;
if (dictionary.TryGetValue(SearchValue.ToString(), out result))
{
    // Result found, stored in the result variable
}
else
{
    // No such item
}
4 голосов
/ 15 апреля 2011

Нет.Было бы лучше, если бы вы использовали словарь или HashSet с меткой в ​​качестве ключа.В вашем случае лучше выбрать словарь:

var dictionary = new Dictionary<string, IList<Item>>();

// somehow fill dictionary

IList<Item> result;
if(!dictionary.TryGetValue(SearchValue.ToString(), out result)
{
    // if you need an empty list 
    // instead of null, if the SearchValue isn't in the dictionary
    result = new List<Item>(); 
}

// result contains all items that have the key SearchValue
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...