C#关于NameValueCollection,Dictionary,List Tuple比较

我们在开发项目,根据实际需要,选择最适合的集合数据类型。

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()键名相同索引器读取的键不存在
NameValueCollectionFalse允许整体更新键对应的值不抛出异常,返回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}");
            }
        }
    }
}
程序运行效果如图:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

斯内科

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值