读了很大的一个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);
}
如果你需要选择是将 数据返回List或者 IEnumerable ,请选择 List对象。 因为选择 IEnumerable,实际执行时,会 创建一个 List 包装对象,这意味着性能会受到不必要开销的影响,这就是为什么你执行count的时候,时间损耗相差会变得这么大!
因为没有继承ICollection<T>,所以每次Count都会循环一次所有的元素得出结果。国外早有相应的文章让大家不要用这个了。。。英文好的话去谷歌查Please, please, please stop using IEnumerable.Count()
记得要看快照,因为原来的文章已经删了。
好牛啊,知识好丰富
@橘生淮南:
楼主你确认这样写能编译通过?
IEnumerable<string> lines = File.ReadLines(fileName, Encoding.Default); for (int i = 1; i < lines.Count; i++) { }
Count是对象的属性,Count()是对象的方法,一般情况属性仅是对字段简单的封装,不会有太多的性能开销,甚至可以内联,好的设计也应该这样做。
@C#开发人员: 是Lines.Count();上面写错了,多谢你们的指导了
可以看下你的txt内容的格式来优化最好呢是把内容分断然后开多线程一做 或许会好一点 仅供参考
for循环中每次执行结束,就要执行 i < lines.Count,相当于每次都要count一下,而ienumerable的count如果没有tolist过,每次执行都是要遍历集合的,你说性能会不会有问题?
明白了,谢谢喽
论
IEnumerable<string> lines = File.ReadLines(fileName, Encoding.Default); for (int i = 1, count = lines.Count(); i < count; i++){}
的重要性