出处:博客园

作者:mumuliang

连接:http://www.cnblogs.com/mumuliang/p/3914425.html

Capacity

在.NET中List的容量应该只是受到硬件限制。

属性Capacity的真正含义,是创建List时给它预分配的容量。

一旦项的数量超过了当前的Capacity,Capacity会以

Capacity = (Capacity==0)?A_VALUE_YOU_CANNOT_SURE:(Capacity*2)

的方式增长。

当使用默认构造函数创建一个List时,Capacity就是0。(或者你非要用一个0作为capacity参数调用构造)

所以当Capacity是0时,我们为List添加了第一个项目后,Capacity是多少呢?

对,是A_VALUE_YOU_CANNOT_SURE

不过,在.NET2.0和.NET4.5中,这个值看上去都是4。

            System.Diagnostics.Debug.WriteLine(string.Format("default capacity is : {0}", new List<string>().Capacity));int initCapacity = 0;List<string> l = new List<string>(initCapacity);System.Diagnostics.Debug.WriteLine(string.Format("constructe a list with capacity: {0}", l.Capacity));for (int u = 0; u < 65; ++u){System.Diagnostics.Debug.WriteLine(string.Format("Count: {0}, Capacity: {1}", l.Count, l.Capacity));//l.TrimExcess();//System.Diagnostics.Debug.WriteLine(string.Format("    TrimExcess() -> Count: {0}, Capacity: {1}", l.Count, l.Capacity));l.Add("1");}

输出

default capacity is : 0
constructe a list with capacity: 0
Count: 0, Capacity: 0
Count: 1, Capacity: 4
Count: 2, Capacity: 4
Count: 3, Capacity: 4
Count: 4, Capacity: 4
Count: 5, Capacity: 8
Count: 6, Capacity: 8
Count: 7, Capacity: 8
Count: 8, Capacity: 8
Count: 9, Capacity: 16
Count: 10, Capacity: 16
Count: 11, Capacity: 16
Count: 12, Capacity: 16
Count: 13, Capacity: 16
Count: 14, Capacity: 16
Count: 15, Capacity: 16
Count: 16, Capacity: 16
Count: 17, Capacity: 32
Count: 18, Capacity: 32
Count: 19, Capacity: 32
Count: 20, Capacity: 32
Count: 21, Capacity: 32
Count: 22, Capacity: 32
Count: 23, Capacity: 32
Count: 24, Capacity: 32
Count: 25, Capacity: 32
Count: 26, Capacity: 32
Count: 27, Capacity: 32
Count: 28, Capacity: 32
Count: 29, Capacity: 32
Count: 30, Capacity: 32
Count: 31, Capacity: 32
Count: 32, Capacity: 32
Count: 33, Capacity: 64
Count: 34, Capacity: 64
Count: 35, Capacity: 64
Count: 36, Capacity: 64
Count: 37, Capacity: 64
Count: 38, Capacity: 64
Count: 39, Capacity: 64
Count: 40, Capacity: 64
Count: 41, Capacity: 64
Count: 42, Capacity: 64
Count: 43, Capacity: 64
Count: 44, Capacity: 64
Count: 45, Capacity: 64
Count: 46, Capacity: 64
Count: 47, Capacity: 64
Count: 48, Capacity: 64
Count: 49, Capacity: 64
Count: 50, Capacity: 64
Count: 51, Capacity: 64
Count: 52, Capacity: 64
Count: 53, Capacity: 64
Count: 54, Capacity: 64
Count: 55, Capacity: 64
Count: 56, Capacity: 64
Count: 57, Capacity: 64
Count: 58, Capacity: 64
Count: 59, Capacity: 64
Count: 60, Capacity: 64
Count: 61, Capacity: 64
Count: 62, Capacity: 64
Count: 63, Capacity: 64
Count: 64, Capacity: 64

View Code

TrimExcess()

TrimExcess()的意思就是,如果Capacity大于Count,清掉哪些没有使用的空间。基本上可以理解成让Capacity等于Count,只是基本上,不能信赖这一点。.NET毕竟还要考虑很多性能问题。TrimExcess method does nothing if the list is at more than 90 percent of capacity——这就是.NET的方式。实际上把上面那段代码中的注释放开,就会看到确实存在Capacity和Count不等的情况(然而,并不是90%哟)。Capacity不够以后的增长规则,仍然是*2,并不会因为被Trim过就只是加1。

放开注释后的输出

default capacity is : 0
constructe a list with capacity: 0
Count: 0, Capacity: 0TrimExcess() -> Count: 0, Capacity: 0
Count: 1, Capacity: 4TrimExcess() -> Count: 1, Capacity: 1
Count: 2, Capacity: 2TrimExcess() -> Count: 2, Capacity: 2
Count: 3, Capacity: 4TrimExcess() -> Count: 3, Capacity: 4
Count: 4, Capacity: 4TrimExcess() -> Count: 4, Capacity: 4
Count: 5, Capacity: 8TrimExcess() -> Count: 5, Capacity: 5
Count: 6, Capacity: 10TrimExcess() -> Count: 6, Capacity: 6
Count: 7, Capacity: 12TrimExcess() -> Count: 7, Capacity: 7
Count: 8, Capacity: 14TrimExcess() -> Count: 8, Capacity: 8
Count: 9, Capacity: 16TrimExcess() -> Count: 9, Capacity: 9
Count: 10, Capacity: 18TrimExcess() -> Count: 10, Capacity: 10
Count: 11, Capacity: 20TrimExcess() -> Count: 11, Capacity: 11
Count: 12, Capacity: 22TrimExcess() -> Count: 12, Capacity: 12
Count: 13, Capacity: 24TrimExcess() -> Count: 13, Capacity: 13
Count: 14, Capacity: 26TrimExcess() -> Count: 14, Capacity: 14
Count: 15, Capacity: 28TrimExcess() -> Count: 15, Capacity: 15
Count: 16, Capacity: 30TrimExcess() -> Count: 16, Capacity: 16
Count: 17, Capacity: 32TrimExcess() -> Count: 17, Capacity: 17
Count: 18, Capacity: 34TrimExcess() -> Count: 18, Capacity: 18
Count: 19, Capacity: 36TrimExcess() -> Count: 19, Capacity: 19
Count: 20, Capacity: 38TrimExcess() -> Count: 20, Capacity: 20
Count: 21, Capacity: 40TrimExcess() -> Count: 21, Capacity: 21
Count: 22, Capacity: 42TrimExcess() -> Count: 22, Capacity: 22
Count: 23, Capacity: 44TrimExcess() -> Count: 23, Capacity: 23
Count: 24, Capacity: 46TrimExcess() -> Count: 24, Capacity: 24
Count: 25, Capacity: 48TrimExcess() -> Count: 25, Capacity: 25
Count: 26, Capacity: 50TrimExcess() -> Count: 26, Capacity: 26
Count: 27, Capacity: 52TrimExcess() -> Count: 27, Capacity: 27
Count: 28, Capacity: 54TrimExcess() -> Count: 28, Capacity: 28
Count: 29, Capacity: 56TrimExcess() -> Count: 29, Capacity: 29
Count: 30, Capacity: 58TrimExcess() -> Count: 30, Capacity: 30
Count: 31, Capacity: 60TrimExcess() -> Count: 31, Capacity: 31
Count: 32, Capacity: 62TrimExcess() -> Count: 32, Capacity: 32
Count: 33, Capacity: 64TrimExcess() -> Count: 33, Capacity: 33
Count: 34, Capacity: 66TrimExcess() -> Count: 34, Capacity: 34
Count: 35, Capacity: 68TrimExcess() -> Count: 35, Capacity: 35
Count: 36, Capacity: 70TrimExcess() -> Count: 36, Capacity: 36
Count: 37, Capacity: 72TrimExcess() -> Count: 37, Capacity: 37
Count: 38, Capacity: 74TrimExcess() -> Count: 38, Capacity: 38
Count: 39, Capacity: 76TrimExcess() -> Count: 39, Capacity: 39
Count: 40, Capacity: 78TrimExcess() -> Count: 40, Capacity: 40
Count: 41, Capacity: 80TrimExcess() -> Count: 41, Capacity: 41
Count: 42, Capacity: 82TrimExcess() -> Count: 42, Capacity: 42
Count: 43, Capacity: 84TrimExcess() -> Count: 43, Capacity: 43
Count: 44, Capacity: 86TrimExcess() -> Count: 44, Capacity: 44
Count: 45, Capacity: 88TrimExcess() -> Count: 45, Capacity: 45
Count: 46, Capacity: 90TrimExcess() -> Count: 46, Capacity: 46
Count: 47, Capacity: 92TrimExcess() -> Count: 47, Capacity: 47
Count: 48, Capacity: 94TrimExcess() -> Count: 48, Capacity: 48
Count: 49, Capacity: 96TrimExcess() -> Count: 49, Capacity: 49
Count: 50, Capacity: 98TrimExcess() -> Count: 50, Capacity: 50
Count: 51, Capacity: 100TrimExcess() -> Count: 51, Capacity: 51
Count: 52, Capacity: 102TrimExcess() -> Count: 52, Capacity: 52
Count: 53, Capacity: 104TrimExcess() -> Count: 53, Capacity: 53
Count: 54, Capacity: 106TrimExcess() -> Count: 54, Capacity: 54
Count: 55, Capacity: 108TrimExcess() -> Count: 55, Capacity: 55
Count: 56, Capacity: 110TrimExcess() -> Count: 56, Capacity: 56
Count: 57, Capacity: 112TrimExcess() -> Count: 57, Capacity: 57
Count: 58, Capacity: 114TrimExcess() -> Count: 58, Capacity: 58
Count: 59, Capacity: 116TrimExcess() -> Count: 59, Capacity: 59
Count: 60, Capacity: 118TrimExcess() -> Count: 60, Capacity: 60
Count: 61, Capacity: 120TrimExcess() -> Count: 61, Capacity: 61
Count: 62, Capacity: 122TrimExcess() -> Count: 62, Capacity: 62
Count: 63, Capacity: 124TrimExcess() -> Count: 63, Capacity: 63
Count: 64, Capacity: 126TrimExcess() -> Count: 64, Capacity: 64

View Code

发现并不是90%以后

System.Diagnostics.Debug.WriteLine(string.Format("default capacity is : {0}", new List<string>().Capacity));int initCapacity = 100;
List<string> l = new List<string>(initCapacity);
System.Diagnostics.Debug.WriteLine(string.Format("constructe a list with capacity: {0}", l.Capacity));int initCount = 100;
for (int u = 0; u < initCount; ++u)
{l.Add(u.ToString());
}for (int u = 0; u < initCount; ++u)
{System.Diagnostics.Debug.WriteLine(string.Format("Count: {0}, Capacity: {1}", l.Count, l.Capacity));l.TrimExcess();System.Diagnostics.Debug.WriteLine(string.Format("    TrimExcess() -> Count: {0}, Capacity: {1}", l.Count, l.Capacity));l.Remove(u.ToString());
}

View Code

得到

default capacity is : 0
constructe a list with capacity: 100
Count: 100, Capacity: 100TrimExcess() -> Count: 100, Capacity: 100
Count: 99, Capacity: 100TrimExcess() -> Count: 99, Capacity: 100
Count: 98, Capacity: 100TrimExcess() -> Count: 98, Capacity: 100
Count: 97, Capacity: 100TrimExcess() -> Count: 97, Capacity: 100
Count: 96, Capacity: 100TrimExcess() -> Count: 96, Capacity: 100
Count: 95, Capacity: 100TrimExcess() -> Count: 95, Capacity: 100
Count: 94, Capacity: 100TrimExcess() -> Count: 94, Capacity: 100
Count: 93, Capacity: 100TrimExcess() -> Count: 93, Capacity: 100
Count: 92, Capacity: 100TrimExcess() -> Count: 92, Capacity: 100
Count: 91, Capacity: 100TrimExcess() -> Count: 91, Capacity: 100
Count: 90, Capacity: 100TrimExcess() -> Count: 90, Capacity: 100
Count: 89, Capacity: 100TrimExcess() -> Count: 89, Capacity: 89
Count: 88, Capacity: 89TrimExcess() -> Count: 88, Capacity: 89
Count: 87, Capacity: 89TrimExcess() -> Count: 87, Capacity: 89
Count: 86, Capacity: 89TrimExcess() -> Count: 86, Capacity: 89
Count: 85, Capacity: 89TrimExcess() -> Count: 85, Capacity: 89
Count: 84, Capacity: 89TrimExcess() -> Count: 84, Capacity: 89
Count: 83, Capacity: 89TrimExcess() -> Count: 83, Capacity: 89
Count: 82, Capacity: 89TrimExcess() -> Count: 82, Capacity: 89
Count: 81, Capacity: 89TrimExcess() -> Count: 81, Capacity: 89
Count: 80, Capacity: 89TrimExcess() -> Count: 80, Capacity: 89
Count: 79, Capacity: 89TrimExcess() -> Count: 79, Capacity: 79
Count: 78, Capacity: 79TrimExcess() -> Count: 78, Capacity: 79
Count: 77, Capacity: 79TrimExcess() -> Count: 77, Capacity: 79
Count: 76, Capacity: 79TrimExcess() -> Count: 76, Capacity: 79
Count: 75, Capacity: 79TrimExcess() -> Count: 75, Capacity: 79
Count: 74, Capacity: 79TrimExcess() -> Count: 74, Capacity: 79
Count: 73, Capacity: 79TrimExcess() -> Count: 73, Capacity: 79
Count: 72, Capacity: 79TrimExcess() -> Count: 72, Capacity: 79
Count: 71, Capacity: 79TrimExcess() -> Count: 71, Capacity: 79
Count: 70, Capacity: 79TrimExcess() -> Count: 70, Capacity: 70
Count: 69, Capacity: 70TrimExcess() -> Count: 69, Capacity: 70
Count: 68, Capacity: 70TrimExcess() -> Count: 68, Capacity: 70
Count: 67, Capacity: 70TrimExcess() -> Count: 67, Capacity: 70
Count: 66, Capacity: 70TrimExcess() -> Count: 66, Capacity: 70
Count: 65, Capacity: 70TrimExcess() -> Count: 65, Capacity: 70
Count: 64, Capacity: 70TrimExcess() -> Count: 64, Capacity: 70
Count: 63, Capacity: 70TrimExcess() -> Count: 63, Capacity: 70
Count: 62, Capacity: 70TrimExcess() -> Count: 62, Capacity: 62
Count: 61, Capacity: 62TrimExcess() -> Count: 61, Capacity: 62
Count: 60, Capacity: 62TrimExcess() -> Count: 60, Capacity: 62
Count: 59, Capacity: 62TrimExcess() -> Count: 59, Capacity: 62
Count: 58, Capacity: 62TrimExcess() -> Count: 58, Capacity: 62
Count: 57, Capacity: 62TrimExcess() -> Count: 57, Capacity: 62
Count: 56, Capacity: 62TrimExcess() -> Count: 56, Capacity: 62
Count: 55, Capacity: 62TrimExcess() -> Count: 55, Capacity: 62
Count: 54, Capacity: 62TrimExcess() -> Count: 54, Capacity: 54
Count: 53, Capacity: 54TrimExcess() -> Count: 53, Capacity: 54
Count: 52, Capacity: 54TrimExcess() -> Count: 52, Capacity: 54
Count: 51, Capacity: 54TrimExcess() -> Count: 51, Capacity: 54
Count: 50, Capacity: 54TrimExcess() -> Count: 50, Capacity: 54
Count: 49, Capacity: 54TrimExcess() -> Count: 49, Capacity: 54
Count: 48, Capacity: 54TrimExcess() -> Count: 48, Capacity: 54
Count: 47, Capacity: 54TrimExcess() -> Count: 47, Capacity: 47
Count: 46, Capacity: 47TrimExcess() -> Count: 46, Capacity: 47
Count: 45, Capacity: 47TrimExcess() -> Count: 45, Capacity: 47
Count: 44, Capacity: 47TrimExcess() -> Count: 44, Capacity: 47
Count: 43, Capacity: 47TrimExcess() -> Count: 43, Capacity: 47
Count: 42, Capacity: 47TrimExcess() -> Count: 42, Capacity: 47
Count: 41, Capacity: 47TrimExcess() -> Count: 41, Capacity: 41
Count: 40, Capacity: 41TrimExcess() -> Count: 40, Capacity: 41
Count: 39, Capacity: 41TrimExcess() -> Count: 39, Capacity: 41
Count: 38, Capacity: 41TrimExcess() -> Count: 38, Capacity: 41
Count: 37, Capacity: 41TrimExcess() -> Count: 37, Capacity: 41
Count: 36, Capacity: 41TrimExcess() -> Count: 36, Capacity: 41
Count: 35, Capacity: 41TrimExcess() -> Count: 35, Capacity: 35
Count: 34, Capacity: 35TrimExcess() -> Count: 34, Capacity: 35
Count: 33, Capacity: 35TrimExcess() -> Count: 33, Capacity: 35
Count: 32, Capacity: 35TrimExcess() -> Count: 32, Capacity: 35
Count: 31, Capacity: 35TrimExcess() -> Count: 31, Capacity: 35
Count: 30, Capacity: 35TrimExcess() -> Count: 30, Capacity: 30
Count: 29, Capacity: 30TrimExcess() -> Count: 29, Capacity: 30
Count: 28, Capacity: 30TrimExcess() -> Count: 28, Capacity: 30
Count: 27, Capacity: 30TrimExcess() -> Count: 27, Capacity: 30
Count: 26, Capacity: 30TrimExcess() -> Count: 26, Capacity: 26
Count: 25, Capacity: 26TrimExcess() -> Count: 25, Capacity: 26
Count: 24, Capacity: 26TrimExcess() -> Count: 24, Capacity: 26
Count: 23, Capacity: 26TrimExcess() -> Count: 23, Capacity: 26
Count: 22, Capacity: 26TrimExcess() -> Count: 22, Capacity: 22
Count: 21, Capacity: 22TrimExcess() -> Count: 21, Capacity: 22
Count: 20, Capacity: 22TrimExcess() -> Count: 20, Capacity: 22
Count: 19, Capacity: 22TrimExcess() -> Count: 19, Capacity: 22
Count: 18, Capacity: 22TrimExcess() -> Count: 18, Capacity: 18
Count: 17, Capacity: 18TrimExcess() -> Count: 17, Capacity: 18
Count: 16, Capacity: 18TrimExcess() -> Count: 16, Capacity: 18
Count: 15, Capacity: 18TrimExcess() -> Count: 15, Capacity: 15
Count: 14, Capacity: 15TrimExcess() -> Count: 14, Capacity: 15
Count: 13, Capacity: 15TrimExcess() -> Count: 13, Capacity: 15
Count: 12, Capacity: 15TrimExcess() -> Count: 12, Capacity: 12
Count: 11, Capacity: 12TrimExcess() -> Count: 11, Capacity: 12
Count: 10, Capacity: 12TrimExcess() -> Count: 10, Capacity: 12
Count: 9, Capacity: 12TrimExcess() -> Count: 9, Capacity: 9
Count: 8, Capacity: 9TrimExcess() -> Count: 8, Capacity: 9
Count: 7, Capacity: 9TrimExcess() -> Count: 7, Capacity: 7
Count: 6, Capacity: 7TrimExcess() -> Count: 6, Capacity: 7
Count: 5, Capacity: 7TrimExcess() -> Count: 5, Capacity: 5
Count: 4, Capacity: 5TrimExcess() -> Count: 4, Capacity: 5
Count: 3, Capacity: 5TrimExcess() -> Count: 3, Capacity: 3
Count: 2, Capacity: 3TrimExcess() -> Count: 2, Capacity: 3
Count: 1, Capacity: 3TrimExcess() -> Count: 1, Capacity: 1

View Code

貌似条件是酱紫的

if( count<(int)Math.Floor((double)capacity*0.9) )

do trim

转载于:https://www.cnblogs.com/paulhe/p/4638657.html

linq之Capacity(转载)相关推荐

  1. Pro LINQ 之三:LINQ to DataSet

    写在前面 将LINQ to DataSet单独放一篇,是因为随后的LINQ to SQL默认只支持MS SQL Server.只有LINQ to DataSet能在没有相应Data Provider帮 ...

  2. linq TO XML 基础

    这样写可以用在linq 查询里面 转载于:https://www.cnblogs.com/gisbeginner/archive/2012/07/10/2584979.html

  3. LINQ to SharePoint 试用感受, 欢迎讨论~

    目前项目需要比较复杂的查询功能, 如果直接写CAML的话以后维护非常麻烦, 然后暂时用LINQ to SharePoint替代之- URL: http://linqtosharepoint.codep ...

  4. Visual Studio 2008 和 .NET 3.5 发布了

    转自:http://blog.joycode.com/scottgu/archive/2007/11/20/111568.aspx [原文地址]Visual Studio 2008 and .NET ...

  5. [ linq2db ] 使用LoadWith()对外键进行查询

    [table]表一 Student { [PrimaryKey]Id,Name,ClassID 外键 -- [Association] |classId | } || [table]表二 | Clas ...

  6. 使用LinqToExcel读取Excel

    我们读取和写入Excel 经常使用NPOI工具,如果我们的需求只是需要读取Excel,可以考虑使用LinqToExcel这个组件.这个组件用起来简单,实用,操作方便,而且结合了Linq的查询特性,ex ...

  7. MVC分页控件之二,为IQueryable定义一个扩展方法,直接反回PagedListT结果集

    namespace Entity {     public interface IPagedList     {         /// <summary>         /// 记录数 ...

  8. 理解C# 3.0的五项主要改进

    1. 隐型局部变量 C# 3.0引入了一个叫做"var"的新关键字.这个关键字允许开发者建立一个变量,但不必明确它的类型.例如,用var说明一个字符串,就像这样: varmyDat ...

  9. 委托、Lambda表达式和事件

    1. 引用方法 委托是寻址方法的.NET版本.在C++中,函数指针只不过是一个指向内存位置的指针,它不是类型安全的.我们无法判断这个指针实际指向什么,像参数和返回类型等项就更无从知晓了.而.NET委托 ...

最新文章

  1. golang if 条件判断语句 简介
  2. 【免费软件测试视频-0031】——QTP系列之---功能测试自动化概要介绍
  3. 中南月赛 1313: ZZY的宠物
  4. 如何编写高性能的C#代码(一)
  5. 千兆网综合布线系统的线缆选型
  6. carbondata与mysql_Apache CarbonData 1.4.0 中文文档
  7. uc3842改可调电源教程_36W LED 防水电源
  8. ssis包部署提示不能与集成身份验证一起使用_何时使用和不使用云原生安全工具...
  9. python json删除字段_如何使用python删除json对象?
  10. 备忘:gcc在linux下打包so库并调用
  11. Qt——P6 QPushButton创建
  12. 互联网日报 | 4月29日 星期四 | 虎牙20亿购买LPL直播版权;返利网正式借壳登陆A股;淘宝直播全面开放官方货品池
  13. 51单片机循迹小车工作原理与程序设计思路
  14. 主板怎么开启csm_手把手教你查看电脑主板是否支持UEFI+GPT启动模式-网络教程与技术 -亦是美网络...
  15. i350在linux系统刷MAC,MAC 10.14 安装教程10-基于黑果小兵大神EFI文件的修改过程
  16. 【设备管理】【OEE】30页精彩PPT:详解精益生产OEE
  17. linux几种锁的分析与比较
  18. SSM框架医院信息管理系统-患者医生考勤管理挂号管理-病房管理-科室管理- (idea开发javaweb-php-asp.netC#-j2ee-springboot)
  19. C# 六十二、正则表达式
  20. 关于配置tft液晶屏时,屏幕不显示遇到的问题

热门文章

  1. html canvas抽奖,HTML5 Canvas圆盘抽奖应用(适用于Vue项目)
  2. 优质网站策划从四个方面进行判断
  3. java实现上传功能吗_Java实现文件上传功能
  4. 查看磁盘uuid命令_Win10推出新的命令行工具,可以查看磁盘空间使用情况
  5. python元类 orm_python-进阶-元类在ORM上的应用详解
  6. python基础网易_十年Python大牛花了三天总结出来的python基础知识实例,超详细!...
  7. 怎么共享电脑上的文件_电脑小技巧--远程访问共享文件夹
  8. 基于深度学习的恶意样本行为检测(含源码) ----采用CNN深度学习算法对Cuckoo沙箱的动态行为日志进行检测和分类...
  9. 兼容ie9以下css3,hover和圆角(htc)
  10. 探索存储机制(1-9)