В чем разница между свойствами Keys и AllKeys в коллекции NameValueCollection? - PullRequest
44 голосов
/ 29 апреля 2009

System.Collections.Specialized.NameObjectCollectionBase имеет два похожих свойства:

  string[] AllKeys
  NameObjectCollectionBase.KeyCollection Keys

Они предоставляют разные наборы данных? Когда я захочу использовать один поверх другого?

Ответы [ 3 ]

61 голосов
/ 29 апреля 2009

AllKeys - операция O(n), а Keys - O(1). Это связано с тем, что AllKeys копирует ключи в новый массив, а Keys просто возвращает ссылку на коллекцию закрытых ключей NameValueCollection. Таким образом, за исключением разницы в производительности, коллекция, возвращаемая Keys, изменится вместе с базовой коллекцией, поскольку это всего лишь ссылка на оригинал, а AllKeys будет изолирована от изменений, потому что это копия.

Эта небольшая тестовая программа показывает разницу в поведении:

using System;
using System.Collections.Specialized;

static class Program
{
    static void Main()
    {
        var collection = new NameValueCollection();

        var keys = collection.Keys;
        var allKeys = collection.AllKeys;

        collection.Add("Name", "Value");

        Console.WriteLine("Keys: " + keys.Count);
        Console.WriteLine("AllKeys: " + allKeys.Length);
        Console.ReadLine();
    }
}

Вывод:

Keys: 1
AllKeys: 0
6 голосов
/ 29 апреля 2009

Согласно документации MSDN, при использовании AllKeys для получения всех значений используется O (n), а при использовании ключей - O (1).

Ключи

Получение значения этого свойства является операцией O (1)

AllKeys

Этот метод является операцией O (n), где n равно Count.

Так что, в принципе, кажется, что ключи имеют лучшую производительность.

5 голосов
/ 29 апреля 2009
Тем не менее,

дает дополнительное преимущество, заключающееся в том, что вы сможете выполнять операции со своей коллекцией, используя foreach или оператор LINQ при возврате AllKeys (). Поскольку это копия, вы не получите ошибок при изменении списка, который в данный момент перечисляется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...