两个结构相同的DataTable;
一个是汇总DataTable数据表,以下称【汇总数据表】;
另一个新增DataTable数据表,以下称【新增数据表】。需要将【新增数据表】中的数据导入到【汇总数据表】中,必须保证每次导入的数据与原【汇总数据表】中数据不重复。(说白一点就是不管在【新增数据表】中向【汇总数据表】导入多少条数据,【汇总数据表】中永远不能有重复的数据)尝试用foreach(...)遍历判断是否重复再添加,这样可以做到,但是只要两个表的数据多起来,速度就会很慢,很慢....请教各位,为达到提速的目的,还有什么好办法可以做到么?谢谢各位。注:这些数据都保存在DataTable中,不能存到数据库中进行处理。DataTable不重复C#添加
一个是汇总DataTable数据表,以下称【汇总数据表】;
另一个新增DataTable数据表,以下称【新增数据表】。需要将【新增数据表】中的数据导入到【汇总数据表】中,必须保证每次导入的数据与原【汇总数据表】中数据不重复。(说白一点就是不管在【新增数据表】中向【汇总数据表】导入多少条数据,【汇总数据表】中永远不能有重复的数据)尝试用foreach(...)遍历判断是否重复再添加,这样可以做到,但是只要两个表的数据多起来,速度就会很慢,很慢....请教各位,为达到提速的目的,还有什么好办法可以做到么?谢谢各位。注:这些数据都保存在DataTable中,不能存到数据库中进行处理。DataTable不重复C#添加
例如:
列1 列2 列3 列4
a 1 c d
a 1 c d
b 2 d f以上第一行和第二行,便算是重复的了;
但是只要两个表的数据多起来,速度就会很慢,很慢....
数据多了为什么不找个存储介质呢,,,要是只是存储在DataTable 中的话,除了循环暂时还没想到别的方法,帮LZ Up
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);
}
}
这个是我项目里的去掉重复字段,你改改吧
1.手动把汇总表的所有列添加成主键列(datatable.constraint.add...),这样在插入新数据时如有重复将引发异常。
2.先让数据都添加进去,然后对汇总表作distinct操作,方式是调用(datatable.defaultview.totable(true,...)方法
当然你也可以把所有列的数据 按规则合并成一个字段,把这个字段当key
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;
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)
插入的时候就不会重复了。或者 合并后去重复,datatable.defaultview.totable(true,字段1,字段2,.......)
if(dt.Tables[0].Rows.IndexOf(DS.Tables[0].Rows[i]) > 0)