/// <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)));
        }