System.Collections.Specialized.NameObjectCollectionBase имеет два похожих свойства:
string[] AllKeys
NameObjectCollectionBase.KeyCollection Keys
Предоставляют ли они разные наборы данных? Когда я захочу использовать один над другим?
System.Collections.Specialized.NameObjectCollectionBase имеет два похожих свойства:
string[] AllKeys
NameObjectCollectionBase.KeyCollection Keys
Предоставляют ли они разные наборы данных? Когда я захочу использовать один над другим?
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
В соответствии с документацией MSDN при использовании AllKeys O (n) извлекает все значения, тогда как при использовании Keys O (1).
Извлечение значения этого свойства является операцией O (1)
Этот метод является операцией O (n), где n является Count.
Итак, похоже, что Keys имеет лучшую производительность.
однако есть дополнительное преимущество, которое вы могли бы выполнить в своей коллекции с помощью foreach или оператора LINQ при возврате AllKeys(). Начиная с его копии, вы не будете получать ошибки, изменяя список, который в настоящее время перечисляется.