我的WCF服务函数返回类型是Dictionary(Of String,String)。所以我必须将我的数据集转换为字典。
这是我的数据集示例。
帐户帐户名称
abc abc1
abc abc2
abc abc3
xyz xyz1
xyz xyz2
xyz xyz3
xyz xyz4
pqr pqr1
pqr pqr2
pqr pqr3
pqr pqr4
pqr pqr5
pqr pqr6
使用LINQ或不使用LINQ,如何将数据集转换为字典(字符串,字符串)
此致 RN
答案 0 :(得分:5)
以下是使用LINQ的一些选项。
最直接的“一线”是:
Dim dictionary =
ds.Tables(0).Rows.OfType(Of DataRow)() _
.ToDictionary(Function (dr) dr.Field(Of String)(0), _
Function (dr) dr.Field(Of String)(1))
我认为VB.NET lamdba语法有点难看,所以我喜欢把它们拉出来:
Dim fk As Func(Of DataRow, String) = Function (dr) dr.Field(Of String)(0)
Dim fv As Func(Of DataRow, String) = Function (dr) dr.Field(Of String)(1)
Dim dictionary = ds.Tables(0).Rows.OfType(Of DataRow)().ToDictionary(fk, fv)
这甚至可能太难看了,所以这是一个选择:
Dim fn as Func(Of Integer, Func(Of DataRow, String)) = _
Function (n) _
Function (dr) _
dr.Field(Of String)(n)
Dim dictionary = ds.Tables(0).Rows.OfType(Of DataRow)().ToDictionary(fn(0), fn(1))
甚至是列名:
Dim fs as Func(Of String, Func(Of DataRow, String)) = _
Function (s) _
Function (dr) _
dr.Field(Of String)(s)
Dim dictionary =
ds.Tables(0).Rows.OfType(Of DataRow)() _
.ToDictionary(fs("AccountName"), fs("Account"))
我希望这些帮助。
答案 1 :(得分:4)
假设第二列是关键,你可以这样做:
Dim ds As DataSet = someValueHere
Dim dc As New Dictionary(Of String, String)
For Each r As DataRow In ds.Tables(0).Rows
dc.Add(r.Item(1).ToString(), r.Item(0).ToString())
Next
我不知道linq是否会有快捷方式。 注意:字典不能包含重复键,因此如果第1列对应于键的第2列和第2列,则不可能。
答案 2 :(得分:2)
以下是LINQ的一个示例,使用了jerjer的答案(第二列是键)的相同假设:
Dim dict As Dictionary(Of string, string) = (From a In ds.Tables(0).AsEnumerable()
Select New With
{
.Key = a.Field(Of String)("AccountName"),
.Val = a.Field(Of String)("Account")
}).AsEnumerable().ToDictionary(Function(k) k.Key, Function(v) v.Val)
语法可能有些偏差,因为我没有那么多VB.NET,但这应该给你一般的想法。