/// <summary> /// Найти инструменты, соответствующие фильтру <paramref name="criteria"/>. /// </summary> /// <param name="criteria">Инструмент, поля которого будут использоваться в качестве фильтра.</param> /// <returns>Найденные инструменты.</returns> public IEnumerable <Security> Lookup(Security criteria) { if (criteria == null) { throw new ArgumentNullException("criteria"); } var filter = criteria.Id.IsEmpty() ? (criteria.Code == "*" ? string.Empty : criteria.Code.ToLowerInvariant()) : criteria.Id.ToLowerInvariant(); IEnumerable <Security> securities; if (filter.IsEmpty()) { var syncCollection = Securities as ISynchronizedCollection <Security>; securities = syncCollection != null ? syncCollection.SyncGet(c => c.ToArray()) : Securities.ToArray(); } else { lock (_trie) { securities = _trie.Retrieve(filter).ToArray(); if (!criteria.Id.IsEmpty()) { securities = securities.Where(s => s.Id.CompareIgnoreCase(criteria.Id)); } } } return(ExcludeFilter == null ? securities : securities.Where(s => !ExcludeFilter(s))); }