DataTable管理一百万条数据,是开六十八线程如故干脆把DataTable替换到Dictionary好,大概其余办法

作者:操作系统    发布时间:2020-01-19 06:47     浏览次数 :

[返回]

DataTable处理一百万条数据,是开多少个线程将数据划分三个DataTable好依然干脆把DataTable替换到Dictionary好?现在要对DataTable中的数据做二遍询问,速度太慢了。。也许别的艺术应用DataTable.Select是3秒多ManageDateds.Tables[3].Select("DsWaveX='"+Start_Time+"'andDsWaveX='"+End_Time+"'"卡塔尔(قطر‎;使用Linq对DataTable也是是3秒左右,快一丝丝,效果不明显varrowAcc1=ManageDateds.Tables[3].AsEnumerable().Where(p=p.FieldDateTime("DsWaveX")=Start_Timep.FieldDateTime("DsWaveX")End_Time).Select(p=new{DsWaveX=p.FieldDateTime("DsWaveX"),DsWaveY=p.Fieldstring("DsWaveY")});

 

转发援引至:

 

 

一、排序 1.获得DataTable的暗许视图
2.对视图设置排序表明式
1zplay电子竞技,3.用排序后的视图导出的新DataTable替换就DataTable(Asc升序可回顾,多列排序用","隔开分离卡塔尔(قطر‎
1)、重生法

复制代码代码如下:

dstaset.Tables.Add(dt)
dataset.Tables(0).DefaultView.Sort = "id desc"

2)、直接法

复制代码代码如下:

dv = New DataView(dt)
dv.Sort = "id desc"
dt = dv.ToTable();

3)、间接法

复制代码代码如下:

dv = New DataView(ds.Tables[0])
dv.Sort = "id desc"
dt = dv.ToTable();

**二、检索

**设置查询字符串
利用Select方法得到到全部知足条件的数据行对象数组 (多项查询条件间,用and隔绝卡塔尔

复制代码代码如下:

DataRow[] matches = dt.Select("id<'003' and name='名字11'");
string strName = matches[0]["name"].ToString();

 

三、合并

若是有2个DataTable:Dt1 , Dt2。表构造相符
将Dt2接在Dt1后可使用此办法

复制代码代码如下:

dt1.Merge(dt2);

 

四、在DataTable中询问相应小心的标题

完毕一个询问,重回二个DataTable后,超级多时候都想在查询结果中继续寻找。这个时候还可以DataTable.Select方法对结果进行再查询
Select方法有4个重载,大家日常使用的正是DataTable.Select(StringState of Qatar
这些String的参数是查询的节制式。相当于SQL查询语言中的WHERE语句(不含WHERE),其语法契合SQL语言语法。
Select方法的回来的是包蕴查询到的多寡的DataRow,然则那个DataRow只是被询问的DataTable的三个映射,所以DataRow是随着DataTable的行变化而改变的。举个例子,DataTable的行都被删去了,那么DataRow中的数据黄金时代致被删除了(即就是先Select,再删除的)
因而,要想把重返的DataRow放进多少体现控件中,需求将其放入另三个DataTable中,即使直白放入原DataTable或将原DataTable的行全部扑灭再放入查询所得的多寡都以老大的,程序会呈现错误,错误提示是“表中本来就有此行”。
除此以外,在一个新表中插入行,不可能直接用DataTable.Rows.Add(DataRow卡塔尔(قطر‎的点子,因为这么是插入多少个新表,约等于DataRow是空的。要用导入行的法门,DataTable.ImportRow(DataRow卡塔尔国。当然,前提是那几个新表要有与原数据表相近的协会。

复制代码代码如下:

Public Function SDEResearch(ByVal InputDT As DataTable, ByVal SearchStr As String) As DataTable

 

'用来囤积再查询后的数码表 
Dim ReSearchDT As DataTable = InputDT.Clone(卡塔尔国'保障有与源数据表相似的表构造

'用来囤积查询后赶回的datarow数组 
Dim ReSearchDR() As DataRow = Nothing

Try 
ReSearchD福特Explorer = InputDT.Select("NAME LIKE '%" + SearchStr + "%'"卡塔尔(قطر‎'只是从数据表中映射出来datarow(卡塔尔(قطر‎,所以无法去除原表中的行 
Catch ex As Exception 
Return Nothing 
End Try

For i As Int16 = 0 To ReSearchDR.Length - 1 
ReSearchDT.ImportRow(ReSearchDR(i)) 
Next

Return ReSearchDT 
End Function

 

附:筛选DataTable数据的秘籍

对DataTable举行过滤筛选的部分主意Select,dataview
当您从数据Curry抽取一些数量,然后要对数码开展整合,你相当的轻巧就能够想到:

复制代码代码如下:

DataTable dt = new DataTable(卡塔尔国;//假若dt是由"SELECT C1,C2,C3 FROM T1"查询出来的结果 
for (int i = 0; i < dt.Rows.Count; i++) 

    if (dt.Rows[i]["C1"].ToString(卡塔尔 == "abc"State of Qatar//查询条件 
    { 
        //实行操作 
    } 
}

但这种做法用意气风发若干次幸亏说,用多了就累了。那有未有越来越好的方法呢?记得LinQ是可以一向对DataTable进行询问操作的,那在.Net Framework 2.0里,有未有相似的办法吗?答案是一定的,正是dt.Select(卡塔尔(قطر‎,上边的操作能够改成那样:

复制代码代码如下:

DataRow[] drArr = dt.Select("C1='abc'");//查询

还是能够如此操作:

复制代码代码如下:

DataRow[] drArr = dt.Select("C1 LIKE 'abc%'"State of Qatar;//模糊查询 
DataRow[] drArr = dt.Select("'abc' LIKE C1 + '%'", "C2 DESC"卡塔尔国;//另后生可畏种模糊查询的不二等秘书籍 
DataRow[] drArr = dt.Select("C1='abc'", "C2 DESC");//排序

主题材料又来了,假诺要把DataRow赋值给新的DataTable,怎么赋值呢?你也许会想到:

复制代码代码如下:

DataTable dtNew = dt.Clone(); 
for (int i = 0; i < drArr.Length; i++) 

    dtNew.Rows.Add(drArr[i]); 
}

但这样程序就能够出错,说该DataRow是归属其余DataTable的,那要怎么做吧?很简单,那样就足以解决了:

复制代码代码如下:

DataTable dtNew = dt.Clone(); 
for (int i = 0; i < drArr.Length; i++) 

    dtNew.ImportRow(drArr[i]); 
}

那样就达成了。
3.5里的DataRow[]有个扩张方法CopyToDataTable(卡塔尔国

复制代码代码如下:

/* 
* 补充一下,仍可以够使用DataView来实现检索的目标。 
*/ 
DataTable dataSource = new DataTable(); 
DataView dv = dataSource.DefaultView; 
dv.RowFilter = "columnA = 'abc'"; 
//1.过滤后直接拿到DataTable 
DataTable newTable1 = dv.ToTable(); 
//2.设置新DataTable的TableName 
DataTable newTable2 = dv.ToTable("NewTableName"); 
//3.安装新表是还是不是过滤重复项,具有的列的列名以至并发的依次 
//即能够设置新表的字段。不过字段名确定是老表dataSource中享有的。 
DataTable newTable3 = 
dv.ToTable(true, new string[] { "columnA,columnF,columnC" }); 
//4.综合了2.3两点。 
DataTable newTable4 = 
dv.ToTable("NewTableName", true, new string[] { "columnA,columnF,columnC" });

 

C#中DataTable删除行的措施,分享给我们供大家参谋之用。具体贯彻格局如下:

投机的删减例子(drTemp是表,gvSummary是dev 的gridview。单击右键点击grid删除):

1、dtTemp.Rows.RemoveAt(gvSummary.FocusedRowHandle);

2、dtTemp.Rows[gvSummary.FocusedRowHandle].Delete();  dtTemp.AcceptChanges();

在C#中,假若要去除DataTable中的某生龙活虎行,大约有以下二种艺术:

1.若果只是想删除datatable中的风流倜傥行,可以用DataRow的delete,不过必定要去除后让DataTable知道,所以就要用到.AcceptChanges(卡塔尔方法,原因是这种删除只是标记性删除,就好像大家普通在数据库中用到的IsDelete字段。

Delete(卡塔尔之后须要datatable.AccepteChanges(卡塔尔(قطر‎方法断定完全除去,因为Delete(卡塔尔只是将相应列的意况标识为除去,还足以通过datatable.RejectChanges(卡塔尔(قطر‎回滚,使该行撤销删除。

2.绝望去除就要用到datatable的.Rows.Remove(DataRow dr卡塔尔(قطر‎方法,同理也只是去除风流罗曼蒂克行能够,要是要循环删除请继续往下看。

3.巡回透顶删除将要用.Rows.RemoveAt(int index卡塔尔方法,所以倘令你是foreach的爱好者,在那请您换换口味,辛亏似果您是for的i++的忠肝义胆fans也盼望你能换个思索。先看一下地点程序的正向写法(错误的,不可用)

?

1
2
3
4
5
for (int i = 0, j = dt.Rows.Count; i < j; i++)
{
  if (Convert.ToInt32(dt.Rows[i]["RowID"]) == RowID)
 dt.Rows.RemoveAt(i);
}

那么些的荒唐在于datatable的RemoveAt(卡塔尔会在剔除后更新dataTable的index,所以你要去除的index恐怕早已不是您的合乎Convert.ToInt32(dt.Rows[i]["RowID"]State of Qatar== RowID的index了,甚者还有恐怕会抛出特别,说你拜候的index不设有。

或然要慎用datatable.Rows.RemoveAt(iState of Qatar,若要删除多行,能够连接用Delete(卡塔尔(قطر‎,然后使用AccepteChanges(卡塔尔(قطر‎方法鲜明删除。

使用select方法:

先把要去除的记录标识一下,然后select删除行,实例代码如下:

?

1
2
3
4
5
6
7
8
9
10
11
12
13
for (int i = 0; i < len; i++)
{
  if (((CheckBox)Rp.Items[i].FindControl("CB")).Checked)
  {
 dt.Rows[i]["C0"] = 1;//标记要删除的记录
  }
}
foreach (DataRow r in dt.Select("c0=1"))
{
  r.Delete();
}
Rp.DataSource = dt;
Rp.DataBind();

感兴趣的敌人可以测量检验运营本文实例以加强精晓,希望本文所述对大家C#次第设计的读书抱有利于。

 

      Select(过滤条件,排序字段State of Qatar;//过滤,并列排在一条线序,如Select("columnname1   like   '%xx%'",columnname2State of Qatar;

1zplay电子竞技 1

DataTable.Select ()方法:

 

  DataRow[] dr = ds.Tables[table_name].Select("数据库绑定在gridview上的列名='该列你要查询的值'");

2、通过搜寻DataTable数据中对应的字段中的值,并为新DataTable填充查找中适合的项,并使DataGridView显现切合过滤条件的数码

  Select(卡塔尔国;//全体查出来   

下一篇:没有了