C#如果读取一个大的文本文档,我的文本是一行一个手机号.如果是一万行.用平常的Reader去,得读几十秒呢!好慢.因为读取得添加到listbox中,还得判断是不是有重复的.重复的不添加.所以速度会有点慢.不知道那位有更好的办法.有这种方面的话.10万估计程序都得死了.有相应的代码更好.先谢谢大家了.

解决方案 »

  1.   

    看一下你的代码,应该有大量的字符串累加操作导致的,用一下StringBuilder
      

  2.   

    先一次性全读取到StreamBuilder中,再把StringBuilder中内容进行处理并绑定
      

  3.   

    把问题分解一下:
    1.读取一行号码
    2.判断是否号码已存在
    3.否,则加入listbox
    4.如果是asp.net的应用,这时会Render为HTML返回我觉得如果只是读取得话,10000行要不了几十秒,所以你的问题应该不在Reader。
    要考虑:
    第2步,是如何处理的,是否有效率问题
    第4步,返回大量的数据是否有网络问题,IE对大量数据的Listbox的处理问题(我遇到过,换成FireFox就快多了)
      

  4.   

    我用C#内存映射的方法来读取,10万条才8秒就全部搞定了.不过判断重复这里消耗了大量的时间.不知道判断重复这里一条一条去判断真的很浪费时间.
     int rs = Regex.Matches(getnumber, sLine).Count;
      getnumber = getnumber.Replace(sLine+",", "");
      getnumber = getnumber.Replace(sLine, "");
         sLine = sLine + "(" + rs+")";
        this.listBox1.Items.Add(sLine);  getnumber是全部的号码. 通过这种正则表达式的方法得到号码的重复数.再把添加到LISTBOX中.这样的方法还耗了可多的时间.很郁闷.这样比循环LISTBOX中的值再一条一条的对比效率应该高可多了. 如果10万数据并判断重复能在20秒操作完我就满意了.
      

  5.   

    读取直接存放到SQL中
    然后再在SQL中进行删除重复的
    然后再读取SQL中的记录来使用
      

  6.   

    用SQL就更慢了.呵呵.读两次还不如一次读完.
      

  7.   

    1w行的listbox,谁用的话算是到了大霉
      

  8.   

    不应该放到StringBuilder
    用List<String>比较好,因为它除了速度快,还能解决重复问题, 而且能给后面处理带来方便
      

  9.   

    不要使用Regex,试试使用Dictionary<string,int>来保存.
    基本算法如下:Dictionary<string,int>d=new Dictionary<string,int>();循环读取行
        if (d.ContainKey(号码))
           d[号码]++;
        else
           d.Add(号码,0);
      

  10.   

    string str = "";
                IntPtr vFileHandle = CreateFile(path,
            GENERIC_READ | GENERIC_WRITE, FileShare.Read | FileShare.Write,
            IntPtr.Zero, FileMode.Open,
            FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, IntPtr.Zero);
                if (INVALID_HANDLE_VALUE != (int)vFileHandle)
                {
                    IntPtr vMappingHandle = CreateFileMapping(
                        vFileHandle, IntPtr.Zero, PAGE_READWRITE, 0, 0, "~MappingTemp");
                    if (vMappingHandle != IntPtr.Zero)
                    {
                        IntPtr vHead = MapViewOfFile(vMappingHandle,
                            FILE_MAP_COPY | FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, IntPtr.Zero);
                        if (vHead != IntPtr.Zero)
                        {
                            uint vSize = GetFileSize(vFileHandle, IntPtr.Zero);
                            byte[] temp = new byte[vSize];
                            for (int i = 0; i < vSize; i++)
                            {
                                byte vTemp = Marshal.ReadByte((IntPtr)((int)vHead + i));
                                temp[i] = vTemp;
                            }
                            ASCIIEncoding encoding = new ASCIIEncoding();
                            str = encoding.GetString(temp).Replace("\r\n", ",");
                            UnmapViewOfFile(vHead);
                        }
                        CloseHandle(vMappingHandle);
                    }
                    CloseHandle(vFileHandle);
                }
                return str;
    转自爱心飞飞网:http://www.aixinff.com/htmls/2618.html
      

  11.   

    用hashtable来判断是否重复啊。就是手机号码,10万的话应该很快啊,我处理过IP地址库,40万条数据,每条数据都有大量文字表明这个IP属于哪个省哪个市,电信还是网通,等等,纯读取的话两秒就结束了。