VB .net将Dictionary项目作为KeyValuePair

时间:2014-09-02 08:52:56

标签: vb.net dictionary

可能是一个菜鸟问题......对我而言,似乎很明显,一本字典可能有一种方法可以通过Key获取它的项目....要么我是盲人,要么...... 但是,我有以下情况:

需要一个字典(整数,k / v)。我已经将k / v放在字典中,并且喜欢通过Key将它们添加到我的新字典中,例如:

'Dict1 has {("Key1", 123), ("Key2", 345)}
dim dict2 as New dictionary (of integer, KeyValuePair(of String, Double))

dict2.add(0,***dict1.GetItem("Key1")***)

当然我可以写一个扩展,也许我必须这样做,但是....只是我错过了这个功能......? 如果我有监督的内置方式,那么请指点我!

提前致谢, 丹尼尔

编辑:

'dict1={(0, "apples"), (1,"oranges"), (2, "bananas")}
'dict2={("oranges",456), ("apples", 123),("bananas",789)}

新词典是由dict1

排序的dict2
'dictnew={("apples", 123),("oranges",456),("bananas",789)}

所以我的方法是,

'dicttemp={(0, ("apples", 123)),(1,("oranges",456)),(2,("bananas",789))} 'dicttemp is a sorteddictionary

接下来我得到temp的值并将它们转换为dict .. 也许我的方法很糟糕: - )

2 个答案:

答案 0 :(得分:0)

您正在寻找for dictionary's indexer

Dim a As Double = dict1("Key1")

在一些评论中,OP说:

  

我需要整个项目为k / v并将dict1的项目添加到dict2 !!!

由于字典实现IEnumerable(Of T) TKeyValuePair(Of TKey, TValue),因此您可以使用Single(...) LINQ扩展方法按键找出键值对:

Dim pair As KeyValuePair(Of String, Double) = dict1.Single(Function(item) item.Key = "key")

由于字典的Add方法有一个重载来赋予键值对作为参数,我相信将dict1键值对添加到dict2只是关于在第二个字典中调用Add,从第一个字典中提供获得的键值对:

dict2.Add(pair);

答案 1 :(得分:0)

所以你已经拥有了密钥,唯一缺少的是价值。因此,您使用索引器或TryGetValue。然后你有两个部分,你可以将它们添加到另一个字典。

Dim dict1 As New Dictionary(Of String, Double) From {{"Key1", 123}, {"Key2", 345}}
Dim dict2 As New Dictionary(Of Integer, KeyValuePair(Of String, Double))
Dim keyVal = New KeyValuePair(Of String, Double)("Key1", dict1("Key1"))
dict2.Add(0, keyVal)

以下是TryGetValue方法:

Dim d As Double
If dict1.TryGetValue("Key1", d) Then
    dict2.Add(0, New KeyValuePair(Of String, Double)("Key1", d))
End If

为了完整起见,你可以使用LINQ,虽然这会很慢而且毫无意义:

Dim keyVal = dict1.FirstOrDefault(Function(kv)kv.Key = "Key1")

现在您正在使用类似于集合的字典,这违背了类的目的。这实际上循环所有项目,直到找到一个给定的密钥。


为了它的价值,因为您已经要求为给定密钥返回KeyValuePair的方法。这是一个扩展方法:

<Extension()>
Public Function TryGetKeyValue(Of TKey, TValue)(dictionary As Dictionary(Of TKey, TValue), key As TKey) As KeyValuePair(Of TKey, TValue)?
    Dim value As TValue
    If dictionary.TryGetValue(key, value) Then
        Return New KeyValuePair(Of TKey, TValue)(key, value)
    End If
    Return Nothing
End Function

你以这种方式使用它:

Dim keyVal As KeyValuePair(Of String, Double)? = dict1.TryGetKeyValue("Key1")
If keyVal.HasValue Then dict2.Add(0, keyVal.Value)

这是一个O(1)操作,所以它比使用LINQ更有效。