Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何存储来自不同数据表的信息?_.net_Vb.net_Datatable_Dataset - Fatal编程技术网

.net 如何存储来自不同数据表的信息?

.net 如何存储来自不同数据表的信息?,.net,vb.net,datatable,dataset,.net,Vb.net,Datatable,Dataset,我有2个数据表(表的第一行可能看起来像): 第一表“差异”: Person1| 0 | -2 | 1 |8 第二个表“年龄”: Person1| 30 | 20 | 2 | 12 我需要为每个人提供的信息是三大“差异”值(按升序排列),并有相应的年龄。例如: Table Person1: 8 | 1 | 0 12| 2 | 30 我可以使用sql查询,在R中我可以使用ListObject,但我是vb.net新手,因此我想知道在vb.net中获取和存储这些信

我有2个数据表(表的第一行可能看起来像):

第一表“差异”:

Person1| 0 | -2 | 1 |8
第二个表“年龄”:

Person1| 30 | 20 | 2 | 12
我需要为每个人提供的信息是三大“差异”值(按升序排列),并有相应的年龄。例如:

Table Person1:  8 | 1 | 0
                12| 2 | 30

我可以使用sql查询,在R中我可以使用ListObject,但我是vb.net新手,因此我想知道在vb.net中获取和存储这些信息(每人)的最佳方法。

如果您对匿名类型和一些linq fu感到满意,请尝试以下方法:

Dim differences = New DataTable()
Dim age = New DataTable()
For Each t in {differences, age}
    For Each v in {"Key", "A", "B", "C", "D"}
        t.Columns.Add(v, If(v="Key", GetType(string),GetType(integer)))
    Next
Next

differences.Rows.Add("Person1", 0, -2, 1, 8)
age.Rows.Add("Person1", 30, 20, 2, 12)

differences.Rows.Add("Person2", 4, 5, 6, 7)
age.Rows.Add("Person2", 1, 2, 3, 4)

Dim result = from d_row in differences.AsEnumerable()
             group join a_row in age on a_row("Key") equals d_row("key") 
             into rows = group
             let match = rows.First()
             select new with
             {
                .Key = d_row("key"),
                .Values = d_row.ItemArray.Skip(1).Zip(match.ItemArray.Skip(1), Function(a, b) Tuple.Create(a, b)) _
                                                 .OrderByDescending(Function(t) t.Item1) _
                                                 .Take(3) _
                                                 .ToArray()
             }
结果:

其思想是连接数据表,将整数值压缩成对,对对对进行排序,并获取每组的前三对

一种较短但可能较慢的方法是省略连接并使用

Dim result = from d_row in differences.AsEnumerable()
             let match = age.AsEnumerable().Single(Function(r) r("Key") = d_row("Key"))
             select new with { ... }
注意,为了简洁起见,我在示例中省略了null检查


针对你的评论:

 ...
 select new with
 {
    .Key = d_row("key"),
    .Values = d_row.ItemArray.Zip(age.Columns.Cast(Of DataColumn), Function(t, c) Tuple.Create(c.ColumnName, t)) _
                             .Skip(1) _
                             .Zip(match.ItemArray.Skip(1), Function(a, b) Tuple.Create(a.item2, b, a.item1)) _
                             .OrderByDescending(Function(t) t.Item1) _
                             .Take(3) _
                             .ToArray()
 }

如果您对匿名类型和linq fu感到满意,请尝试以下方法:

Dim differences = New DataTable()
Dim age = New DataTable()
For Each t in {differences, age}
    For Each v in {"Key", "A", "B", "C", "D"}
        t.Columns.Add(v, If(v="Key", GetType(string),GetType(integer)))
    Next
Next

differences.Rows.Add("Person1", 0, -2, 1, 8)
age.Rows.Add("Person1", 30, 20, 2, 12)

differences.Rows.Add("Person2", 4, 5, 6, 7)
age.Rows.Add("Person2", 1, 2, 3, 4)

Dim result = from d_row in differences.AsEnumerable()
             group join a_row in age on a_row("Key") equals d_row("key") 
             into rows = group
             let match = rows.First()
             select new with
             {
                .Key = d_row("key"),
                .Values = d_row.ItemArray.Skip(1).Zip(match.ItemArray.Skip(1), Function(a, b) Tuple.Create(a, b)) _
                                                 .OrderByDescending(Function(t) t.Item1) _
                                                 .Take(3) _
                                                 .ToArray()
             }
结果:

其思想是连接数据表,将整数值压缩成对,对对对进行排序,并获取每组的前三对

一种较短但可能较慢的方法是省略连接并使用

Dim result = from d_row in differences.AsEnumerable()
             let match = age.AsEnumerable().Single(Function(r) r("Key") = d_row("Key"))
             select new with { ... }
注意,为了简洁起见,我在示例中省略了null检查


针对你的评论:

 ...
 select new with
 {
    .Key = d_row("key"),
    .Values = d_row.ItemArray.Zip(age.Columns.Cast(Of DataColumn), Function(t, c) Tuple.Create(c.ColumnName, t)) _
                             .Skip(1) _
                             .Zip(match.ItemArray.Skip(1), Function(a, b) Tuple.Create(a.item2, b, a.item1)) _
                             .OrderByDescending(Function(t) t.Item1) _
                             .Take(3) _
                             .ToArray()
 }

太好了,谢谢你的回答!!我只是试着理解你的代码。一个问题。“linq fu”是指“linq功能性”吗“或者你的意思是?”武功意义上的鲁迪·林克;也许你已经听说过谷歌富这个词了。这只是个玩笑:-)啊,好吧!!:)我已经在埋头研究一本linq的书了。谢谢对不起,我还有一个问题。如何输出数组元素?我尝试了:将结果输出中的每个res的输出设置为New System.Text.StringBuilder。AppendLine(res.ToString)下一个MsgBox(output.ToString),但没有成功。我也尝试过类似的东西:MsgBox(result(0).Values.ToString),但就是无法得到你得到的输出。你可以使用类似
String.Join(Environment.NewLine,result.Select(Function(a)String.Format(“{0}:{1}”),a.Key,String.Join(“,”,a.Values.Select(Function(t)String.Format([{0}{1}]),t.Item1,t.Item2()))
创建一个简单的字符串输出<代码>结果包含匿名类型的集合。这种类型有两个属性:第一个属性是it
Key
,它只包含Key列,另一个属性是
Values
,它包含一个
元组数组(整数,整数)
。在这些元组中,
Item1
是来自
差异的值,
Item2
是来自
年龄的值。太好了,谢谢你的回答!!我只是试着理解你的代码。一个问题。“linq fu”是指“linq功能性”吗“或者你的意思是?”武功意义上的鲁迪·林克;也许你已经听说过谷歌富这个词了。这只是个玩笑:-)啊,好吧!!:)我已经在埋头研究一本linq的书了。谢谢对不起,我还有一个问题。如何输出数组元素?我尝试了:将结果输出中的每个res的输出设置为New System.Text.StringBuilder。AppendLine(res.ToString)下一个MsgBox(output.ToString),但没有成功。我也尝试过类似的东西:MsgBox(result(0).Values.ToString),但就是无法得到你得到的输出。你可以使用类似
String.Join(Environment.NewLine,result.Select(Function(a)String.Format(“{0}:{1}”),a.Key,String.Join(“,”,a.Values.Select(Function(t)String.Format([{0}{1}]),t.Item1,t.Item2()))
创建一个简单的字符串输出<代码>结果
包含匿名类型的集合。这种类型有两个属性:第一个属性是it
Key
,它只包含Key列,另一个属性是
Values
,它包含一个
元组数组(整数,整数)
。在这些元组中,
Item1
是来自
差异的值,
Item2
是来自
年龄的值。