Предоставляют ли они разные наборы данных? Когда я захочу использовать один над другим?
Ответ 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).
Этот метод является операцией O (n), где n является Count.
Итак, похоже, что Keys имеет лучшую производительность.
Ответ 3
однако есть дополнительное преимущество, которое вы могли бы выполнить в своей коллекции с помощью foreach или оператора LINQ при возврате AllKeys(). Начиная с его копии, вы не будете получать ошибки, изменяя список, который в настоящее время перечисляется.