.net 如何存储来自不同数据表的信息?
我有2个数据表(表的第一行可能看起来像): 第一表“差异”:.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中获取和存储这些信
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()))
创建一个简单的字符串输出<代码>结果包含匿名类型的集合。这种类型有两个属性:第一个属性是itKey
,它只包含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()))
创建一个简单的字符串输出<代码>结果
包含匿名类型的集合。这种类型有两个属性:第一个属性是itKey
,它只包含Key列,另一个属性是Values
,它包含一个元组数组(整数,整数)
。在这些元组中,Item1
是来自差异的值,Item2
是来自年龄的值。