LINQ查询或只是Vb.net中Datatable的正常循环 [英] LINQ Query or just normal for loop on Datatable in Vb.net

查看:63
本文介绍了LINQ查询或只是Vb.net中Datatable的正常循环的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Hello Experts,



这是一个我担心的问题。我是LINQ的新手。

这是我的数据表

现在我有两个单选按钮,其中应该有以下结果



选择Rbn1,它显示了Datatble的所有结果。如下所示



项目评论
1减少BIN-A
1清算BIN-A

2减少BIN-C
2减少BIN-D
2减少BIN-E

3减少BIN-A1
3减少BIN-A1
3清算BIN-A1
3减少BIN-A2
3减少BIN-A2

4清算BIN-A3
4减少BIN-A4
4清除BIN-A4
4减少BIN-A5





选择Rbn2时,它应仅显示以下结果



项目评论
1减少BIN-A
1清算BIN-A

<罢工> 2减少BIN-C
2减少BIN-D
2减少BIN-E

3减少BIN-A1
3减少BIN-A1
3清算BIN-A1
<执行> 3减少BIN-A2
3减少BIN-A2

4清算BIN-A3
4减少BIN-A4
4清算BIN-A4
<打击> 4减少BIN-A5









含义在识别已清除的bin和减少Bin的循环中,它应该只显示bin被清除的那些。



我希望我不会混淆。



请帮我查询LINQ查询。或者,如果有任何其他简单的选择也很棒。



谢谢

解决方案

关于您的要求:



 ' 创建示例DataTable  
Dim dt AS DataTable = DataTable()
' 添加列
dt.Columns.Add( DataColumn( < span class =code-string> Item,Type。 GetType < span class =code-string> System.Int32)))
dt.Columns.Add( New DataColumn( Comment,Type。 GetType System.String)))
< span class =code-comment>' 添加行
dt.Rows.Add( 对象(){ 1 缩小BIN-A})
dt.Rows.Add( 对象(){ 1 < span class =code-string>已清除BIN-A})
dt.Rows.Add( 对象(){ 2 减少BIN-C})
dt.Rows.Add( 对象(){ 2 缩减BIN-D})
dt.Rows.Add( 对象(){ 2 减少BIN-E})
dt.Rows.Add( New Object (){ 3 减少BIN-A1})
dt.Rows.Add( 对象(){ 3 减少BIN- A1})
dt.Rows.Add( 对象() { 3 已清除BIN-A1})
dt.Rows.Add( New 对象(){ 3 减少BIN-A2})
dt.Rows.Add( 对象(){ 3 减少BIN- A2})
dt.Rows.Add( 对象() { 4 已清除BIN-A3})
dt.Rows.Add( New Object (){ 4 精简BIN-A4})
dt.Rows.Add( New Object (){ 4 已清除B IN-A4})
dt.Rows.Add( 对象 (){ 4 缩小BIN-A5})


Dim clearedBins = dt.AsEnumerable()_
选择功能(c) 使用 _
{_
Key .Item = c.Field( of Integer )( Item),_
Key。 Action = c.Field( Of String )( 注释)。子串( 0 ,c.Field( Of String )( Comment )。IndexOf( )),_
Key .Bin = c.Field( Of String )( 注释)。子串(c.Field( Of String )( Comment)。IndexOf( ),_
(c.Field( of < span class =code-keyword> String )( Comment)。长度 - c.Field( Of String )( 注释)。IndexOf( ))) _
})_
.GroupBy(功能(a) 使用 {Key .Bin = a.Bin,Key .Item = a.Item})_
选择功能(g) _
{_
Key .Bin = g.Key.Bin,_
Key .Item = g.Key.Item,_
Key .Action = 字符串 .Join( ,g。选择功能(x)x.Action))_
})_
。 Where( Function (b)b.Action.Contains( 已清除))_
.ToList()





  //  创建示例DataTable  
DataTable dt = new DataTable();
// 添加列
dt.Columns.Add( new DataColumn( Item typeof int )));
dt.Columns.Add( new DataColumn( 评论 typeof string )));
// 添加行
dt.Rows.Add( new Object [] { 1 缩减BIN-A});
dt.Rows.Add( new Object [] { 1 已清除BIN-A});
dt.Rows.Add( new Object [] { 2 缩减BIN-C});
dt.Rows.Add( new Object [] { 2 减少BIN-D});
dt.Rows.Add( new Object [] { 2 缩小BIN-E});
dt.Rows.Add( new Object [] { 3 缩减BIN-A1});
dt.Rows.Add( new Object [] { 3 缩减BIN-A1});
dt.Rows.Add( new Object [] { 3 已清除BIN-A1});
dt.Rows.Add( new Object [] { 3 缩小BIN-A2});
dt.Rows.Add( new Object [] { 3 缩小BIN-A2});
dt.Rows.Add( new Object [] { 4 已清除BIN-A3});
dt.Rows.Add( new Object [] { 4 缩小BIN-A4});
dt.Rows.Add( new Object [] { 4 已清除BIN-A4});
dt.Rows.Add( new Object [] { 4 缩小BIN-A5});


var clearedBins = dt.AsEnumerable()
.Select(c => new
{
Item = c.Field< int>( Item),
Action = c.Field< string>( Comment)。子串( 0 ,c.Field< string>( 评论) .IndexOf( )),
Bin = c.Field< string>(< span class =code-string> Comment)。Substring(c.Field< string>( 注释)。IndexOf( ),(c.Field< string>( Comment)。长度 - c.Field< str ing>( Comment)。IndexOf( )))
})
.GroupBy(a => new {a.Bin,a.Item})
。选择(g =>新
{
Bin = g.Key.Bin,
Item = g.Key.Item,
Action = string .Join( ,g。选择( x => x.Action))
})
.Where(b => b.Action.Contains( 已清除))
.ToList();



结果:



  Bin项目行动 
BIN-A 1减少,清算
BIN-A1 3减少,减少,清算
BIN-A3 4清算
BIN-A4 4减少,清算





随意更改它符合您的需求。


尝试使用以下代码:

 DataTa ble table1 =  new  DataTable(); 
// 将数据行添加到table1对象

var itemList =( from r in table1.AsEnumerable ()
其中 r.Field< string>( Comment)。包含( 已清除BIN
选择 new
{
item = r.Field< int>( 项目
comment = r.Field< string>( Comment
})。ToList();

foreach var tempRec in itemList)
{
int tempItem = tempRec.item;
string commentStr = tempRec.comment;
}



这里我根据你的问题只使用了两列(Item,Comment)。如果您有更多列,则可以更改/添加。其次我假设 Item 列是 int Commnet 列是 string ,如果它不是你需要的那个修改


Hello Experts,

Here is an question where I am worried about. I am newbie to LINQ.
Here is my Datatable
Now I have two radio buttons in which following results should come

on selecting Rbn1, It shows all the Results from Datatble as it was. Like below

Item  Comment
1    Reduced BIN-A
1    Cleared BIN-A

2   Reduced BIN-C
2   Reduced BIN-D
2   Reduced BIN-E

3   Reduced BIN-A1
3   Reduced BIN-A1
3   Cleared BIN-A1
3   Reduced BIN-A2
3   Reduced BIN-A2

4   Cleared BIN-A3
4   Reduced BIN-A4
4   Cleared BIN-A4
4   Reduced BIN-A5



On selecting Rbn2, It should show only the below results

Item  Comment
1    Reduced BIN-A
1    Cleared BIN-A

2   Reduced BIN-C
2   Reduced BIN-D
2   Reduced BIN-E

3   Reduced BIN-A1
3   Reduced BIN-A1
3   Cleared BIN-A1
3   Reduced BIN-A2
3   Reduced BIN-A2

4   Cleared BIN-A3
4   Reduced BIN-A4
4   Cleared BIN-A4
4   Reduced BIN-A5





Meaning in the loop of identifying the cleared bin and reduced Bin , It should show only those where the bin is cleared.

I hope I am not confusing.

Please help me with LINQ query. Or if there is any other easy alternative is also great.

Thanks

解决方案

As to your requirements:


'create example DataTable
Dim dt AS DataTable = New DataTable()
'add columns
dt.Columns.Add(New DataColumn("Item", Type.GetType("System.Int32")))
dt.Columns.Add(New DataColumn("Comment", Type.GetType("System.String")))
'add rows
dt.Rows.Add(New Object(){1, "Reduced BIN-A"})
dt.Rows.Add(New Object(){1, "Cleared BIN-A"})
dt.Rows.Add(New Object(){2, "Reduced BIN-C"})
dt.Rows.Add(New Object(){2, "Reduced BIN-D"})
dt.Rows.Add(New Object(){2, "Reduced BIN-E"})
dt.Rows.Add(New Object(){3, "Reduced BIN-A1"})
dt.Rows.Add(New Object(){3, "Reduced BIN-A1"})
dt.Rows.Add(New Object(){3, "Cleared BIN-A1"})
dt.Rows.Add(New Object(){3, "Reduced BIN-A2"})
dt.Rows.Add(New Object(){3, "Reduced BIN-A2"})
dt.Rows.Add(New Object(){4, "Cleared BIN-A3"})
dt.Rows.Add(New Object(){4, "Reduced BIN-A4"})
dt.Rows.Add(New Object(){4, "Cleared BIN-A4"})
dt.Rows.Add(New Object(){4, "Reduced BIN-A5"})


Dim clearedBins = dt.AsEnumerable() _
        .Select(Function(c) New With _
            { _
                Key .Item = c.Field(Of Integer)("Item"), _
                Key .Action = c.Field(Of String)("Comment").Substring(0, c.Field(Of String)("Comment").IndexOf(" ")), _
                Key .Bin = c.Field(Of String)("Comment").Substring(c.Field(Of String)("Comment").IndexOf(" "), _
                        (c.Field(Of String)("Comment").Length - c.Field(Of String)("Comment").IndexOf(" "))) _
            }) _
        .GroupBy(Function(a) New With{Key .Bin=a.Bin, Key .Item = a.Item}) _
        .Select(Function(g) New With _
            { _
                Key .Bin = g.Key.Bin, _
                Key .Item = g.Key.Item, _
                Key .Action = String.Join(",", g.Select(Function(x) x.Action)) _
            }) _
        .Where(Function(b) b.Action.Contains("Cleared")) _
        .ToList()



//create example DataTable
DataTable dt = new DataTable();
//add columns
dt.Columns.Add(new DataColumn("Item", typeof(int)));
dt.Columns.Add(new DataColumn("Comment", typeof(string)));
//add rows
dt.Rows.Add(new Object[]{1, "Reduced BIN-A"});
dt.Rows.Add(new Object[]{1, "Cleared BIN-A"});
dt.Rows.Add(new Object[]{2, "Reduced BIN-C"});
dt.Rows.Add(new Object[]{2, "Reduced BIN-D"});
dt.Rows.Add(new Object[]{2, "Reduced BIN-E"});
dt.Rows.Add(new Object[]{3, "Reduced BIN-A1"});
dt.Rows.Add(new Object[]{3, "Reduced BIN-A1"});
dt.Rows.Add(new Object[]{3, "Cleared BIN-A1"});
dt.Rows.Add(new Object[]{3, "Reduced BIN-A2"});
dt.Rows.Add(new Object[]{3, "Reduced BIN-A2"});
dt.Rows.Add(new Object[]{4, "Cleared BIN-A3"});
dt.Rows.Add(new Object[]{4, "Reduced BIN-A4"});
dt.Rows.Add(new Object[]{4, "Cleared BIN-A4"});
dt.Rows.Add(new Object[]{4, "Reduced BIN-A5"});


var clearedBins = dt.AsEnumerable()
		.Select(c=>new
			{
				Item = c.Field<int>("Item"),
				Action = c.Field<string>("Comment").Substring(0, c.Field<string>("Comment").IndexOf(" ")),
				Bin = c.Field<string>("Comment").Substring(c.Field<string>("Comment").IndexOf(" "), (c.Field<string>("Comment").Length - c.Field<string>("Comment").IndexOf(" ")))
			})
		.GroupBy(a=>new {a.Bin, a.Item})
		.Select(g=>new
			{
				Bin = g.Key.Bin,
				Item = g.Key.Item,
				Action = string.Join(",", g.Select(x=>x.Action))
			})
 		.Where(b=>b.Action.Contains("Cleared"))
		.ToList();


Result:

Bin    Item Action
BIN-A  1    Reduced,Cleared 
BIN-A1 3    Reduced,Reduced,Cleared 
BIN-A3 4    Cleared 
BIN-A4 4    Reduced,Cleared 



Feel free to change it to your needs.


Try with below code:

DataTable table1 = new DataTable();
// Add Data Row to table1 object

var itemList = (from r in table1.AsEnumerable()
			  where r.Field<string>("Comment").Contains("Cleared BIN")
			  select new
			  {
				  item = r.Field<int>("Item")
				  comment = r.Field<string>("Comment")
			  }).ToList();
			  
foreach (var tempRec in itemList)
{
	int tempItem = tempRec.item;
	string commentStr = tempRec.comment;
}


Here I used only two columns(Item, Comment) as per your question. you can change/add if you have more columns. Secondly I assumed that Item column is int and Commnet column is string if it is other than that you need to modify.


这篇关于LINQ查询或只是Vb.net中Datatable的正常循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆