NameValueCollection继承自NameObjectCollectionBase,然而,与NameObjectCollectionBase不同,该类可以在单个键(key)下存储多个字符串值(即可以添加相同的Key)。此类型的集合不会保留元素的排序,并且枚举集合时不会保证特定排序。
NameValueCollection初始化时,涉及三个概念:容量(capacity )、哈希码提供者、比较器
无参构造函数 NameValueCollection()初始化实例时,该实例元素为空且具有默认初始容量(默认容量为0),并使用不区分大小写的默认哈希代码提供程序和不区分大小写的默认比较器。
Capacity
NameValueCollection的容量(Capacity )可以在实例化时通过构造函数指定。随着元素的添加,它的容量将自动根据需要重新分配。
哈希码提供者
哈希码提供者为NameValueCollection中的键分配哈希码。默认的哈希代码提供程序是CaseInsensitiveHashCodeProvider。
比较器
比较器确定两个键是否相等。默认的比较器是一个 CaseInsensitiveComparer,它使用不变区域性的约定;也就是说,默认情况下键比较是不区分大小写的。
要执行区分大小写的键比较,调用构造函数NameValueCollection(IEqualityComparer),并提供 StringComparer.CurrentCulture, StringComparer.InvariantCulture或 StringComparer.Ordinal 作为
equalityComparer参数。
示例
默认情况下键不区分大小写,键默认为小写,示例如下:
NameValueCollection nv = new NameValueCollection();
nv.Add("red","草莓");
nv.Add("RED", "樱桃");
nv.Add("green", "青枣");
nv.Add("Green", "青柠檬");
nv.Add("yellow", "香蕉");
foreach (var key in nv.AllKeys)
{
Console.WriteLine($"{key}的水果有:{nv.Get(key)}");
}
Console.ReadKey();
如果键需要区分大小写,需要在实例化时指定IEqualityComparer参数:StringComparer.Ordinal
NameValueCollection nv = new NameValueCollection(StringComparer.Ordinal);
nv.Add("red","草莓");
nv.Add("RED", "樱桃");
nv.Add("green", "青枣");
nv.Add("Green", "青柠檬");
nv.Add("yellow", "香蕉");
foreach (var key in nv.AllKeys)
{
Console.WriteLine($"{key}的水果有:{nv.Get(key)}");
}
Console.ReadKey();
注意
key和value是string类型。
引用:using System.Collections.Specialized;
读取相同的key时,输出结果对Value进行了合并,这就是NameValueCollection与一般键值对的主要区别所在。
https://learn.microsoft.com/zh-cn/dotnet/api/system.collections.specialized.namevaluecollection?view=net-7.0