一个有10000多行,分行读取并存入hashtable中,想让hashtable有1000条时输出,最后不足1000条的也输出到一个文本中
Hashtable ht = new Hashtable( 1000 );
         string line;
           using (StreamReader sr = new StreamReader(inFilePath, Encoding.Default))
           {
               while (sr.Peek() >= 0)
               {
                   line = sr.ReadLine();
                   ht.Add(line,null);
               }
           }
            StreamWriter sw = new StreamWriter(outpath, false, Encoding.Default);
           .....问题是初始化hashtable的大小后,所有的内容还是都加进了ht中
菜鸟请教

解决方案 »

  1.   

    用 List 就可以了。HashTable的初始大小和限制容量没有一点关系,你属于用错误的方法解决错误的问题。List<string> list = new List<string>();
    using (StreamReader sr = new StreamReader(inFilePath, Encoding.Default))
               {
                   while (sr.Peek() >= 0)
                   {
                       line = sr.ReadLine();
                       list.Add(line);
                       if (list.Count() > 1000)
                       {
                            StreamWriter sw = new StreamWriter(outpath, false, Encoding.Default);
                            ...
                       }
                   }
               }
      

  2.   

    楼上:用List不能清除重复数据,要不然人家也不用hashtable了。
    楼主:Hashtable( 1000 )并不能限定hashtable的最终长度,所以在添加数据处还得自己判断。
      

  3.   

    是么?
    HashTable可以清除么?
    好,就算有一种数据结构可以。那么建立在要一次性把数据读进来的前提下,否则下1000条和上1000条的某条还是可能重复。如果可以一次性读取进来,那就更简单了:
    List<string> list = new List<string>();
    while (peek >0)
    {
        list.Add(...)
    }
    list = list.Distinct().ToList();
    for (int i = 0; i < list.Count() / 1000 + 1)
    {
        var currentlist = list.Skip(i * 1000).Take(1000).ToList();
        StreamWriter sw = new StreamWriter(outpath, false, Encoding.Default);
        foreach (var item in currentlist)
        {
            //写入item
        }
    }
      

  4.   


    什么叫做“初始化hashtable的大小”?不管你怎么初始化“大小”,其保存的数据的多少也都是0。当Add的时候,假设预留的空间不够了,那么会自动扩展一倍大小的空间,并且重新hash。
      

  5.   

    HashTable是很古老原始的东西了。现代的人都用Dictionary<K,T>。这也是hash,而且具有明确的泛型约束。
      

  6.   

    不怕。
    Take() 会自动取剩下的,也就是说,Take(n),当序列多于n的时候,取得n条,当序列不足n的时候,有多少取多少。
      

  7.   

    本帖最后由 caozhy 于 2011-07-22 13:38:31 编辑
      

  8.   

    再说如果你的文件只有1万多行,假设每行100个汉字,或者200个字节。
    那么也才 2MB,现在的内存都是 GB 级别的,有什么关系呢。你真的遇到性能问题,还是性能问题是想象中的。
      

  9.   

    Hashtable ht = new Hashtable( 1000 );
    //1000,你知道1000什么意思不