В чем разница между индексированным поиском и поиском по ключу - PullRequest
1 голос
/ 07 мая 2020

Просматривая документы для KeyedCollection, я прочитал следующее:

Класс KeyedCollection обеспечивает как индексированное извлечение O (1), так и извлечение по ключу, приближающееся к O (1).

https://docs.microsoft.com/en-us/dotnet/api/system.collections.objectmodel.keyedcollection-2?view=netcore-3.1

Я не совсем понимаю, что это значит. Я лично думаю, что индексированный поиск и поиск по ключу - это одно и то же, поскольку словарь индексируется по ключам. Полагаю, я не совсем понимаю термины «индексированный поиск» и «поиск по ключу».

Так в чем разница и почему цвет лица отличается?

Дополнительная информация: я лично хотел бы использовать keyedCollection, потому что у меня есть список, который будет добавлен ко многим. Время от времени мне нужно получить элемент по идентификатору - Guid и вернуть некоторые данные. Я также периодически go просматриваю список и удаляю все элементы, которые больше не использую.

Sample;

    /// <summary>
    /// A collection of leases. Implements <see cref="KeyedCollection{TKey,TItem}"/> which is a dictionary-list hybrid.
    /// </summary>
    public class LeaseInfoCollection : KeyedCollection<Guid, LeaseInfo>
    {
        #region Construction and Destruction

        /// <inheritdoc />
        public LeaseInfoCollection()
        {
        }

        /// <inheritdoc />
        public LeaseInfoCollection(IEqualityComparer<Guid> comparer)
            : base(comparer)
        {
        }

        /// <inheritdoc />
        public LeaseInfoCollection(IEqualityComparer<Guid> comparer, int dictionaryCreationThreshold)
            : base(comparer, dictionaryCreationThreshold)
        {
        }

        #endregion

        #region Overrides of KeyedCollection<string,LeaseInfo>

        /// <inheritdoc />
        protected override Guid GetKeyForItem(LeaseInfo item)
        {
            return item.LeaseId;
        }

        #endregion
    }

1 Ответ

0 голосов
/ 07 мая 2020

Ответ на этот вопрос находится в следующем абзаце документации :

Класс KeyedCollection<TKey,TItem> представляет собой гибрид между коллекцией, основанной на IList<T> generi Интерфейс c и коллекция на основе интерфейса IDictionary<TKey,TValue> generi c. Подобно коллекциям, основанным на интерфейсе IList<T> generi c, KeyedCollection<TKey,TItem> является индексированным списком элементов. Подобно коллекциям, основанным на интерфейсе IDictionary<TKey,TValue> generi c, KeyedCollection<TKey,TItem> имеет ключ, связанный с каждым элементом.

Из этого абзаца мы можем узнать, что мы можем получить доступ к элементам KeyedCollection коллекцию, используя их порядковые индексы или их ключи.

Вот образец (на основе образца из MSDN ), чтобы показать эти два подхода к извлечению элементов KeyedCollection:

public class OrderItem
{
    public OrderItem(string partNumber) => PartNumber = partNumber;

    public string PartNumber { get; }
}

// Custom KeyedCollection.
public class SimpleOrder : KeyedCollection<string, OrderItem>
{
    // Here we define how to get Key from Item for our custom KeyedCollection.
    protected override string GetKeyForItem(OrderItem item) => item.PartNumber;
}

internal static class Program
{
    private static void Main()
    {
        KeyedCollection<string, OrderItem> kc = new SimpleOrder();

        kc.Add(new OrderItem("#0"));
        kc.Add(new OrderItem("#1"));

        // Retrieve item by index.
        Console.WriteLine(kc[0].PartNumber);

        // Retrieve item by key.
        Console.WriteLine(kc["#1"].PartNumber);
    }
}
...