两个结构相同的DataTable;
一个是汇总DataTable数据表,以下称【汇总数据表】;
另一个新增DataTable数据表,以下称【新增数据表】。需要将【新增数据表】中的数据导入到【汇总数据表】中,必须保证每次导入的数据与原【汇总数据表】中数据不重复。(说白一点就是不管在【新增数据表】中向【汇总数据表】导入多少条数据,【汇总数据表】中永远不能有重复的数据)尝试用foreach(...)遍历判断是否重复再添加,这样可以做到,但是只要两个表的数据多起来,速度就会很慢,很慢....请教各位,为达到提速的目的,还有什么好办法可以做到么?谢谢各位。注:这些数据都保存在DataTable中,不能存到数据库中进行处理。DataTable不重复C#添加

解决方案 »

  1.   

    不会存在空值的问题;
    例如:
    列1   列2   列3   列4
    a     1     c     d
    a     1     c     d
    b     2     d     f以上第一行和第二行,便算是重复的了;
      

  2.   


    但是只要两个表的数据多起来,速度就会很慢,很慢....
    数据多了为什么不找个存储介质呢,,,要是只是存储在DataTable 中的话,除了循环暂时还没想到别的方法,帮LZ Up
      

  3.   

     DataRow[] rows; 
            DataRow[] rows1;
            DataTable dt = new DataTable("creName");
            DataColumn dc1 = new DataColumn("product", Type.GetType("System.String"));
            DataColumn dc2 = new DataColumn("ProductName", Type.GetType("System.String"));
            DataColumn dc3 = new DataColumn("Parvalue", Type.GetType("System.String"));
            DataColumn dc4 = new DataColumn("ProductType", Type.GetType("System.String"));
            DataColumn dc5 = new DataColumn("CategoryName", Type.GetType("System.String"));
            dt.Columns.Add(dc1);
            dt.Columns.Add(dc2);
            dt.Columns.Add(dc3);
            dt.Columns.Add(dc4);
            dt.Columns.Add(dc5);
            for (int i = 0; i < DS.Tables[0].Rows.Count; i++)
            {
              rows=   DS.Tables[0].Select("ProductId=" + DS.Tables[0].Rows[i][0] + "");
              rows1 = dt.Select("product=" + DS.Tables[0].Rows[i][0] + ""); //用于判断改ProductId是否已经写入dt中
              if (rows.Length > 1)
              {
                  string a = "";
                  string Name = "";
                  string Parvalue = "";
                  string ProductType = "";
                  string CategoryName = "";
                  if (rows1.Length != 1)
                  {
                      foreach (DataRow row in rows)  // 将查询的结果添加到dt中;
                      {
                          a =  row[1].ToString();
                          Name = row[0].ToString();
                          Parvalue = row[2].ToString();
                          ProductType = row[3].ToString();
                          CategoryName = CategoryName + row[4].ToString() + "<br/>";
                         
                      }
                      DataRow dr = dt.NewRow();
                      dr[0] = Name;
                      dr[1] = a;
                      dr[2] = Parvalue;
                      dr[3] =ProductType;
                      dr[4] = CategoryName;
                      dt.Rows.Add(dr);
                  }
              }
    这个是我项目里的去掉重复字段,你改改吧
      

  4.   

    两个办法:
    1.手动把汇总表的所有列添加成主键列(datatable.constraint.add...),这样在插入新数据时如有重复将引发异常。
    2.先让数据都添加进去,然后对汇总表作distinct操作,方式是调用(datatable.defaultview.totable(true,...)方法
      

  5.   

    问题是什么叫做不重复,不重复的依据是啥,如果是key你直接datatable.merge方法就是如果是全列比较,最好是新入一个时间戳字段把此字段当key,然后使用datatable.marge方法,
    当然你也可以把所有列的数据 按规则合并成一个字段,把这个字段当key
      

  6.   

    ps:不管你在哪里存储,内存也好,数据库也罢,哪怕就是txt里面。你首先要做的就是解决如何判定不重复。先解决这个在来谈有没有啥多快好省的代码
      

  7.   

    用Linq来处理一下。
    var QueryTable =
                from dr1 in tablek.AsEnumerable()
                from dr2 in tabled.AsEnumerable()
                where dr1.Field<string>("A") != dr2.Field<string>("A") && dr1.Field<int>("B") != dr2.Field<int>("B") && dr1.Field<string>("C") != dr2.Field<string>("C") && dr1.Field<string>("D") != dr2.Field<string>("D")
                select dr2;
      

  8.   

    这个玩意其实只需要把datatable设置一个联合主键,就能快速解决不重复的问题我写了一个例子
      DataTable dt = new DataTable();
                dt.Columns.Add("A");
                dt.Columns.Add("B");
    //把A,B设置为联合主键
              dt.PrimaryKey = new DataColumn[] { dt.Columns["A"], dt.Columns["B"] };           dt.LoadDataRow(new object[] { "a1", "b1" },false);
               dt.LoadDataRow(new object[] { "a2", "b2" },false);
    //另外建一个相同结构的表,
               DataTable dt1 = new DataTable();
               dt1.Columns.Add("A");
               dt1.Columns.Add("B");           //a1,b1和原表冲突,但有联合主键判定,所以合并结果不更新
               dt1.LoadDataRow(new object[] { "a1", "b1" }, false);
             //a1,b2,虽然出现了a1,但因为是联合主键,a1,b2在原表里没有,则合并结果为新增
               dt1.LoadDataRow(new object[] { "a1", "b2" }, false);
              //a3,b3原表根本没有,所以合并结果为新增
               dt1.LoadDataRow(new object[] { "a3", "b3" }, false);           dt.Merge(dt1);//合并两个dt,以dt为主表,dt1为附表,使用dt的主键设置,dt里没有的主键记录新增(insert);dt如果已经存在主键,其他非主键不同则更新(update)
      

  9.   

    提个建议,要不直接加到数据库中,通过sql语句删除表中的重复项。
      

  10.   

    为DataTable 建立一个主键或唯一索引。
    插入的时候就不会重复了。或者 合并后去重复,datatable.defaultview.totable(true,字段1,字段2,.......)
      

  11.   

    循环新增表和汇总表比较.不同的记录,list.ad(insert 不同记录);循环完毕.用事物执行list就可以实现吧
      

  12.   

    现丑一下,也可以这么写: 
    if(dt.Tables[0].Rows.IndexOf(DS.Tables[0].Rows[i]) > 0)