话说Dictionary的效率比List的高?html
为何高呢?这个你们能够百度下。数组
固然,我也并非彻底认同。而后后了测试,反正结果是……性能
其实在不少状况下是根据不一样的使用环境来选择使用。测试
例如:List<int> 和 Dictionary<int,int>this
就拿这两个的添加和数据遍历或者是查找单一数据体spa
当循环遍历查找1500次,发现list的速度下降了不少。pwa
能够发现for循环查找的效率随次数增长而递减。那么我也很好奇,为何会这样子捏?List一次的Find和1000次的Find会有这么大的效率之差?初步猜想是因为List的for循环引发。3d
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ListVsDictionary { class Program { static void Main(string[] args) { Stopwatch watch1 = new Stopwatch(); Stopwatch watch2 = new Stopwatch(); Dictionary<int, Baga> dic = new Dictionary<int, Baga>(); List<Baga> list = new List<Baga>(); Console.WriteLine("Add Function:"); watch1.Start(); for (int i = 0; i < 9000; i++) { dic.Add(i, new Baga(i, i, 8)); } Console.WriteLine("Dic: \t" + watch1.Elapsed); watch1.Stop(); watch2.Start(); for (int i = 0; i < 9000; i++) { list.Add(new Baga(i, i, 8)); } Console.WriteLine("List: \t" + watch2.Elapsed); watch2.Stop(); Console.WriteLine("For Function:"); watch1.Start(); foreach (var item in dic) { var dd = item.Value.ToString(); } Console.WriteLine("Dic: \t" + watch1.Elapsed); watch1.Stop(); watch2.Start(); foreach (var item in list) { var dd = item; } Console.WriteLine("List: \t" + watch2.Elapsed); watch2.Stop(); Console.WriteLine("Search Function:"); watch1.Start(); Baga idVal1 = new Baga(); dic.TryGetValue(99, out idVal1); Console.WriteLine("Dic: \t" + watch1.Elapsed); watch1.Stop(); watch2.Start(); list.Find(x => x.Id == 99); Console.WriteLine("List: \t" + watch2.Elapsed); watch2.Stop(); Console.WriteLine("For Search Function:"); watch1.Start(); Baga idVal = new Baga(); for (int i = 0; i < 1500; i++) { var getDic = dic.TryGetValue(999, out idVal); } Console.WriteLine("Dic: \t" + watch1.Elapsed); watch1.Stop(); watch2.Start(); for (int i = 0; i < 1500; i++) { var getList = list.Find(x => x.Id == 999); } Console.WriteLine("List: \t" + watch2.Elapsed); watch2.Stop(); } } public class Baga { public Baga() { } #region 初始化 public Baga(int id, int num, int type) { this.Id = id; this.Num = num; this.Type = type; this.Name = "asdfffffffffffffffffffffffffffffasdfffffffffffffffffff"; } #endregion public int Id { get; set; } public int Num { get; set; } public int Type { get; set; } public string Name { get; set; } public int FriendsToken { get; private set; } public int Energy { get; private set; } public int MaxEnergy { get; private set; } } }
最后,给出MSDN上的建议:code
1.若是须要很是快地添加、删除和查找项目,并且不关心集合中项目的顺序,那么首先应该考虑使用 System.Collections.Generic.Dictionary<TKey, TValue>(或者您正在使用 .NET Framework 1.x,能够考虑 Hashtable)。三个基本操做(添加、删除和包含)均可快速操做,即便集合包含上百万的项目。htm
2.若是您的使用模式不多须要删除和大量添加,而重要的是保持集合的顺序,那么您仍然能够选择 List<T>。虽然查找速度可能比较慢(由于在搜索目标项目时须要遍历基础数组),但能够保证集合会保持特定的顺序。
3.您能够选择 Queue<T> 实现先进先出 (FIFO) 顺序或 Stack<T> 实现后进先出 (LIFO) 顺序。虽然 Queue<T> 和 Stack<T> 都支持枚举集合中的全部项目,但前者只支持在末尾插入和从开头删除,然后者只支持从开头插入和删除。
4.若是须要在实现快速插入的同时保持顺序,那么使用新的 LinkedList<T> 集合可帮助您提升性能。与 List<T> 不一样,LinkedList<T> 是做为动态分配的对象链实现。与 List<T> 相比,在集合中间插入对象只须要更新两个链接和添加新项目。从性能的角度来看,连接列表的缺点是垃圾收集器会增长其活动,由于它必须遍历整个列表以确保没有对象没有被释放。另外,因为每一个节点相关的开销以及每一个节点在内存中的位置等缘由,大的连接列表可能会出现性能问题。虽然将项目插入到 LinkedList<T> 的实际操做比在 List<T> 中插入要快得多,可是找到要插入新值的特定位置仍需遍历列表并找到正确的位置。