LINQ查询或只是Vb.net中Datatable的正常循环 [英] LINQ Query or just normal for loop on Datatable in Vb.net
问题描述
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-A2 Reduced BIN-C 2 Reduced BIN-D 2 Reduced BIN-E3 Reduced BIN-A1 3 Reduced BIN-A1 3 Cleared BIN-A13 Reduced BIN-A2 3 Reduced BIN-A24 Cleared BIN-A3 4 Reduced BIN-A4 4 Cleared BIN-A44 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屋!