Подтвердить что ты не робот

В чем разница между свойствами Keys и AllKeys на NameValueCollection?

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

  string[] AllKeys
  NameObjectCollectionBase.KeyCollection Keys

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

4b9b3361

Ответ 1

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

Ответ 2

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

Keys

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

AllKeys

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

Итак, похоже, что Keys имеет лучшую производительность.

Ответ 3

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