哈希表:ht
Datatable:dtht中存储key,value与dt中存储的a1,a2对应(是同类型数据)
现在的问题是需要在ht和dt之间进行对比,找到:
ht中有的而dt中没有的作为新增的数据项,可以用(HashTable)ht_add来保存
ht中key与a1,value与a2不完全一致的用 ht_update保存
dt中有的而ht中没有的用 ht_del来保存不知道大家明白了没有?

解决方案 »

  1.   

    循环hashtable,用contains方法进行比较!
      

  2.   

    可以用(HashTable)ht_add来保存 
    ht中key与a1,value与a2不完全一致的用 ht_update保存 
    ==================================================
    这句把我给弄糊涂了.首先,你看这个这两种类型有没有find之类的方法,如果有,基本可以用这种自己带的方法实现.
    如果没有,就看下面:
    就是个双重循环,一个个比对一下.for(int i=0;i<ht.Count;i++)
    {
      int FindIndex=-1;
      for(int j=0;j<ds.Rows.Count;j++)
      {
        if(ht[i].key.ToString()==ds.Rows[0][j].ToString())
        {
          if(ht[i].value.ToString()==ds.Rows[1][j].ToString())
          {
            FindIndex= i;
            break;
          }
        }
      }
      if(FindIndex>=0)
      {
          ht_update.Add(ht[FindIndex]);
      }
    }注意,以上是伪代码,只是告诉你思路.
      

  3.   

    除了你给了些代码,谢谢先,其他人都是来混的。
    更新的好说,我就是不知道如何得到不同的:
    1、ht中有的而dt中没有的作为新增的数据项,可以用(HashTable)ht_add来保存 
    2、dt中有的而ht中没有的用 ht_del来保存 
    我不是不知道用循环,一句简单的循环就搞定了,没那么简单把。希望你们能真正的做一下我所说的例子!
      

  4.   

    哈希表:ht 
    Datatable:dt HashTable ht_Add = new HashTable();
    HashTable ht_Update = new HashTable();
    HashTable ht_delete = new HashTable();foreach(Dictionary dic in ht)
    {
      if(dt.Select("a1='"+dic.Key.ToString()+"'" + "AND a2='" + dic.Value.ToString()+"'").Length==0)
      {
        //增加项目
        ht_Add.Add(dic.Key,dic.Value);  }
      else
      if(dt.Select("a1='"+dic.Key.ToString()+"'").Length!=0 || dt.Select("a2='"+dic.Value.ToString()+"'").Length!=0 ))
      {
        //更新项目
        ht_Update.Add(dic.Key,dic.Value);  }
      
    }for(int i=0;i<dt.Rows.Count;i++)
    {
       if(!ht.ContainsKey(dt.Rows[i][0].ToString()) && !ht.ContainsValue(dt.Rows[i][1].ToString  ()))
      {
       //删除项目
       ht_delete.Add(dt.Rows[i][0].ToString(),dt.Rows[i][1].ToString());
      } 
    }
      

  5.   


    彻底晕了,这两句话压根就是一个意思.
    你是不是又第三个数据源做为筛选的条件?如果只是ht和dt对比,取并集,那么你这两句话就是一个意思,也就是说最后ht_add和ht_del的内容是一样的.
      

  6.   

    我觉得应该用table.Select.好些,减少一些循环。
    我呆一会给你详细测试
      

  7.   


    我觉得应该用table.Select.好些,减少一些循环。 
    我呆一会给你详细测试
      

  8.   

    当然不一样假设:
    ht     dt
    1       1
    2       2
            3
    此时ht中有而dt中没有的集合就是空,没有需要新增的。
    如果是:
    ht    dt
    1      1
    2      2
    3
    此时dt中有而ht中没有的集合也是空,没有需要删除的。
      

  9.   

    非常感谢您的代码,dt.select很不错,前面都陷入循环当中了。
    问题已经解决了,一会儿就结贴
      

  10.   

    我做的例子, 调试成功了
    DataTable table = new DataTable();
                DataColumn d = new DataColumn("A",System.Type.GetType("System.Int32"));
                DataColumn d1 = new DataColumn("AA", System.Type.GetType("System.Int32"));
                table.Columns.Add(d);
                table.Columns.Add(d1);            DataRow r1= table.NewRow(); //same
                r1[0]=100;
                r1[1]=200;
                table.Rows.Add(r1);
                DataRow r2= table.NewRow(); //del
                r2[0]=1000;
                r2[1]=2000;
                table.Rows.Add(r2);
                DataRow r3= table.NewRow(); //update
                r3[0]=110;
                r3[1]=210;
                table.Rows.Add(r3);
                DataRow r4= table.NewRow(); // del
                r4[0]=2100;
                r4[1]=2200;
                table.Rows.Add(r4);
                //
                Hashtable Htable = new Hashtable();
                Htable.Add("100", "200"); // same
                Htable.Add("1200", "133"); // new 
                Htable.Add("110", "3433"); //update
                Htable.Add("1300", "13433"); // new 
                
                Hashtable ht_Add = new Hashtable();
                Hashtable ht_Update = new Hashtable();
                Hashtable ht_del = new Hashtable();
                foreach (DictionaryEntry dic in Htable)
                {
                    if (table.Select("A='" + dic.Key.ToString() +"'").Length==0 && table.Select("AA='" + dic.Value.ToString()+"'").Length == 0)
                    {
                        ht_Add.Add(dic.Key, dic.Value);
                    }
                    else if ((table.Select("A='" + dic.Key + "'").Length != 0 && table.Select("AA='" + dic.Value + "'").Length == 0) || (table.Select("A='" + dic.Key + "'").Length == 0 && table.Select("AA='" + dic.Value + "'").Length != 0))
                    {
                        ht_Update.Add(dic.Key, dic.Value);
                        
                    }
                }
                for (int i = 0; i < table.Rows.Count; i++)
                {
                    if (!Htable.ContainsKey(table.Rows[i][0].ToString()) && !Htable.ContainsValue(table.Rows[i][1].ToString()))
                    {
                        ht_del.Add(table.Rows[i][0].ToString(), table.Rows[i][1].ToString());
                    }
                }