我们在开发项目,根据实际需要,选择最适合的集合数据类型。
NameValueCollection、Dictionary<string,string>,List<Tuple<string,string>>三个类都可以表示键值对集合。
但根据使用场景的不同,建议选择不同的类型来进行相应的处理。
NameValueCollection用于键名不区分大小写,比如读取(或写入)ini文件,键名是不区分大小写的。nvc[键名]不存在将返回null,并不抛出异常。
Dictionary<string,string>用于键名必须唯一的,而且对重复键增加元素将提示异常。dict[键]如果不存在将抛出异常。
System.Collection.Speic.NameValueCollection 键Key不区分大小写。每一个键可以对应多个值【一个键对应一个字符串数组】
增加相同的键,不抛出异常,只是增加该键对应的值的数组个数+1
System.Dictionay<string,string> 键key区分大小写。dict.Add()如果键名重复,将抛出异常。dict读取不存在的键,将抛出异常。
System.List<Tuple<string,string>> 元组,键和值都可以重复。每个元组元素都是独立的。
表格如下:
类 | 键区分大小写 | Add()键名相同 | 索引器 | 读取的键不存在 |
---|---|---|---|---|
NameValueCollection | False | 允许 | 整体更新键对应的值 | 不抛出异常,返回null |
Dictionary<string,string> | True | 不允许 | 整体更新键对应的值 | 抛出异常 |
List<Tuple<string,string>> | True | 允许 | 无 | 无 |
以下为测试程序。
新建.net core 3.1控制台应用程序SpecialCollectionDemo,测试代码如下:
using System;
using System.Collections.Specialized;
using System.Collections.Generic;
using System.Linq;
namespace SpecialCollectionDemo
{
class Program
{
/// <summary>
/// 声明一个测试委托
/// </summary>
static Action action;
static void Main(string[] args)
{
action = TestNameValueCollection;
action();
action = TestListTuple;
action();
action = TestDictionary;
action.Invoke();
Console.ReadLine();
}
/// <summary>
/// 测试NameValueCollection
/// </summary>
static void TestNameValueCollection()
{
Console.WriteLine("NameValueCollection的键名不区分大小写,Add函数当键相同时,只是增加对应的值的数组增加一个元素...");
NameValueCollection nvc = new NameValueCollection();
nvc.Add("ABC", "景天");
nvc.Add("abc", "重楼");
nvc.Add("123", "雪见");
Console.WriteLine($"测试索引器:{nvc["ABC"]}");
Console.WriteLine($"测试Get函数:{nvc.Get("aBc")}");
string[] values = nvc.GetValues("abc");
Console.WriteLine($"测试GetValues函数:{string.Join(",", values)}");
Console.WriteLine("NameValueCollection当键不存在时,返回null");
string testNull = nvc["hello"];
Console.WriteLine($"NameValueCollection不存在的键hello,对应的值是否为null:{testNull == null}");
}
/// <summary>
/// 测试元组集合
/// </summary>
static void TestListTuple()
{
Console.WriteLine("测试List<Tuple<string, string>>...");
List<Tuple<string, string>> list = new List<Tuple<string, string>>();
list.Add(Tuple.Create("ABC", "紫萱"));
list.Add(new Tuple<string, string>("abc", "长卿"));
list.Add(Tuple.Create("123", "龙葵"));
list.Add(Tuple.Create("ABC", "清微"));
list.ForEach(tuple => Console.WriteLine($"Name:{tuple.Item1},Value:{tuple.Item2}"));
}
/// <summary>
/// 测试字典Dictionary
/// </summary>
static void TestDictionary()
{
Console.WriteLine("测试Dictionary<string, string>...");
Console.WriteLine("字典Dictionary区分大小写,如果使用Add函数增加相同的键时,将抛出异常");
Dictionary<string, string> dict = new Dictionary<string, string>();
dict.Add("ABC", "张三");
dict.Add("abc", "李四");
dict["ABC"] = "石碏";//重新设置值
dict.Add("hello", "world");
dict["Test"] = "success";
for (int i = 0; i < dict.Count; i++)
{
KeyValuePair<string,string> keyValuePair =dict.ElementAt(i);
Console.WriteLine($"key:{keyValuePair.Key},value:{keyValuePair.Value}");
}
try
{
Console.WriteLine("测试增加相同的键...");
dict.Add("ABC", "州吁");
}
catch (Exception ex)
{
Console.WriteLine($"增加相同的键_出现异常:{ex.Message}");
}
try
{
Console.WriteLine("尝试读取不存在的键key");
string testValue = dict["NotExists"];
Console.WriteLine(testValue);
}
catch (Exception ex)
{
Console.WriteLine($"读取不存在的键_出现异常:{ex.Message}");
}
}
}
}
程序运行效果如图: