首页 新闻 会员 周边 捐助

为什么计算IEnumerable<string>的Count属性灰常耗时

0
[待解决问题]

读了很大的一个txt,先存到了IEnumerable<string>里,然后用For逐行处理,开始时for (int i = 1; i < lines.Count; i++)  非常慢,快一个小时才处理几万条,后来转为List用她的Count,不到十秒25万全部处理完。后来专门试了一下IEnumerable的Count计算一次的时间,大概和List.Count计算1000000的时间差不多。大家知道为什么吗?

IEnumerable<string> lines = File.ReadLines(fileName, Encoding.Default);//读取全部行,是 IEnumerable<string>
List<string> strs = lines.ToList();//转一下类型

DataTable datatable = new DataTable();//创建一个表,等会把读的数据存进去,有三列入下
datatable.Columns.Add("NumStart");
datatable.Columns.Add("Area");
datatable.Columns.Add("NumType");
DateTime datatime1 = DateTime.Now;
//利用for 把数据插入Datatable

//for (int i = 1; i < lines.Count; i++)//
for (int i = 1; i < strs.Count; i++)//第一行是列名,不要,所以i=1
{
string[] str = strs[i].Split('\t');//分割字符串
string NumStart = str[0];
string Area = str[1].Trim('"');
string NumType = str[2].Trim('"');
//把数据加入dataTable
DataRow newRow = datatable.NewRow();
newRow["NumStart"] = NumStart;
newRow["Area"] = Area;
newRow["NumType"] = NumType;
datatable.Rows.Add(newRow);
}

橘生淮南的主页 橘生淮南 | 初学一级 | 园豆:198
提问于:2014-08-20 10:43
< >
分享
所有回答(6)
0

如果你需要选择是将 数据返回List或者 IEnumerable ,请选择 List对象。 因为选择 IEnumerable,实际执行时,会 创建一个 List 包装对象,这意味着性能会受到不必要开销的影响,这就是为什么你执行count的时候,时间损耗相差会变得这么大!

技术_菜鸟 | 园豆:71 (初学一级) | 2014-08-20 10:53
0

因为没有继承ICollection<T>,所以每次Count都会循环一次所有的元素得出结果。国外早有相应的文章让大家不要用这个了。。。英文好的话去谷歌查Please, please, please stop using IEnumerable.Count()

 

记得要看快照,因为原来的文章已经删了。

XiaoFaye | 园豆:3087 (老鸟四级) | 2014-08-20 10:54

好牛啊,知识好丰富

支持(0) 反对(0) 橘生淮南 | 园豆:198 (初学一级) | 2014-08-20 11:00

@橘生淮南: 

楼主你确认这样写能编译通过?

IEnumerable<string> lines = File.ReadLines(fileName, Encoding.Default);
for (int i = 1; i < lines.Count; i++)

{

}

Count是对象的属性,Count()是对象的方法,一般情况属性仅是对字段简单的封装,不会有太多的性能开销,甚至可以内联,好的设计也应该这样做。

支持(1) 反对(0) C#开发人员 | 园豆:181 (初学一级) | 2014-08-20 13:35

@C#开发人员: 是Lines.Count();上面写错了,多谢你们的指导了

支持(0) 反对(0) 橘生淮南 | 园豆:198 (初学一级) | 2014-08-21 11:28
0

参考园子里的一篇博文:Linq中Count()和Any()引发的效率问题

dudu | 园豆:29568 (高人七级) | 2014-08-20 11:07
0

可以看下你的txt内容的格式来优化最好呢是把内容分断然后开多线程一做 或许会好一点 仅供参考

望着天的蜗牛 | 园豆:354 (菜鸟二级) | 2014-08-20 21:12
0

for循环中每次执行结束,就要执行 i < lines.Count,相当于每次都要count一下,而ienumerable的count如果没有tolist过,每次执行都是要遍历集合的,你说性能会不会有问题?

吴瑞祥 | 园豆:29449 (高人七级) | 2014-08-21 07:09

明白了,谢谢喽

支持(0) 反对(0) 橘生淮南 | 园豆:198 (初学一级) | 2014-08-21 11:29
0

IEnumerable<string> lines = File.ReadLines(fileName, Encoding.Default);
for (int i = 1, count = lines.Count(); i < count; i++){}

的重要性

heerake | 园豆:163 (初学一级) | 2014-08-22 18:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册