Что быстрее, и я должен пожертвовать стандартом Linq для достижения скорости (предполагающий, что Поиск по словарю действительно быстрее)? Таким образом позвольте мне уточнить:
У меня есть следующее:
List<Product> products = GetProductList();
У меня есть потребность искать продукт на основе некоторого атрибута, например, порядкового номера. Я мог сначала создать словарь и затем заполнить его следующим образом:
Dictionary<string, Product> dict = new Dictionary<string, Product>();
foreach(Product p in products)
{
dict.Add(p.serial, p);
}
Когда будет пора найти продукт, используйте в своих интересах O (1) предлагаемый Поиском по словарю:
string some_serial = ...;
try { Product p = dict[some_serial]; } catch(KeyNotFoundException) { }
С другой стороны, использующий Linq:
Product p = products.Where(p => p.serial.Equals(some_serial)).FirstOrDefault();
Недостаток с подходом Dict, конечно, это требует, чтобы больше пространства в памяти, больше кода записало, менее изящный, и т.д. (хотя большая часть из этого спорна). Предположите, что это - нефактор. Я должен проявить первый подход?
В заключение, я хотел бы подтвердить, действительно ли сложность подхода Linq выше O (n), и я не вижу, как это может быть лучше, чем это.
Предполагая, что вы начинаете с перечисления объектов и делаете это только один раз ...
Будет быстрее использовать метод Where
, чем добавлять в Dictionary
и затем искать его обратно. Причина в том, что метод словаря не O(1). В этом сценарии вы добавляете элементы в словарь, а затем просматриваете его. Часть добавления является O(N), что так же дорого, как и метод Where
с дополнительными накладными расходами памяти.
Еще один незначительный момент, о котором следует знать: Dictionary
не является действительно O(1). Вместо этого он приближается к O(1), но при определенных обстоятельствах (например, при большом количестве несовпадающих ключей) может ухудшиться до меньшей производительности.