podría ser un noob la pregunta… Para mí me parece obvio, que un diccionario podría tener un método para conseguir que el elemento Clave…. O yo estoy ciego, o…
Sin embargo, tengo la siguiente situación:

Una necesidad de un diccionario (de un entero k/v). Tengo el k/v ya está en un diccionario y le gustó para agregarlos a mi nueva Clave, tales como:

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

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

Estoy seguro de que podría escribir una Extensión, y probablemente voy a tener, pero…. es que solo me falta esta función…?
Si había construido en la manera en la que he supervisado, así que por favor me apunte allí!

Gracias de antemano,
Daniel

EDICIÓN:

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

el nuevo diccionario es una ordenados dict2 por dict1

'dictnew={("apples", 123),("oranges",456),("bananas",789)}

Así que mi enfoque era,

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

siguiente puedo obtener los valores de temperatura y llevarlos a una dict..
Tal vez mi enfoque es malo en absoluto 🙂

  • ¿Quieres construir un segundo diccionario a partir de una primera donde la clave de la nueva diccionario es el índice del primer diccionario y el valor es KeyValuePair?
  • No, las Claves para el nuevo viene el diff de la fuente. De todos modos, puedo Actualizar mi Pregunta para aclarar toda la tarea 🙂 General estaba preguntando de los que no puedo acceder a la dict elementos directamente…
InformationsquelleAutor dba | 2014-09-02

2 Comentarios

  1. 2

    Usted está buscando para el diccionario del indizador.

    Dim a As Double = dict1("Key1")

    En algún comentario, OP dijo:

    Necesito todo elemento de k/v y agregar el elemento de dict1 a dict2!!!

    Desde un diccionario implementa IEnumerable(Of T) donde T es KeyValuePair(Of TKey, TValue), puede utilizar Single(...) LINQ método de extensión para averiguar un par clave-valor clave:

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

    Desde el diccionario de la Add método tiene una sobrecarga para dar un par clave-valor como argumento, creo que la adición de dict1 par clave-valor para dict2 es sólo acerca de cómo llamar a Add en la segunda diccionario de proporcionar a los obtenidos par clave-valor de primer diccionario:

    dict2.Add(pair);
    • Esto devuelve el valor de la dict-elemento… necesito que todo elemento de k/v y agregar el elemento de dict1 a dict2!!!
    • ¿Mi actualización de satisfacer a su pregunta? 😛
    • Gracias por la respuesta, yo no era consciente de la LINQ-Método. De todos modos, he implementado un Diccionario de Extensión, por lo que he simplificado la línea de la llamada para el k/v-par (ya que está en un bucle…)
    • Yo creo que la simplificación de Single es inútil, yo entiendo que usted quiere deshacerse de las lambdas y cierres en el bucle… pero es solo cuestión de acostumbrarse con ella!
    • estaba usando «Único» en la Extensión. En lugar de una para cada una de las pruebas y la Clave. AFAIK lambdas de trabajo del mismo modo en la base… que Puede estar mal 🙂 Gracias por las respuestas!
    • Bien lambdas son sólo expresiones. Pero tienes razón, si que apuntan a que el hecho de que LINQ es sólo un montón de especialidad de la para-feachs detrás de una hermosa azúcar sintáctico 😀 también puede utilizar SingleOrDefault así que si la clave no existe, se devuelve null o un valor predeterminado para el diccionario de valores de tipo.

  2. 0

    Así que ya tienes la llave, la única parte que falta es el valor. Por lo tanto, utilizar el indizador o TryGetValue. Entonces usted tiene dos partes y se puede agregar a la otra diccionario.

    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)

    Aquí es el TryGetValue enfoque:

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

    Aras de la exhaustividad, puede utilizar LINQ aunque esto sería lenta y sin sentido:

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

    Ahora usted está usando un diccionario como una colección que va en contra del propósito de la clase. Esta realidad bucles de todos los elementos hasta que se encuentre uno con una clave dada.


    Para lo que vale, ya que usted ha pedido un método que devuelve un KeyValuePair para una clave dada. Aquí es un método de extensión:

    <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

    Se utiliza en esta forma:

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

    Es un O(1) de la operación, por lo que es más eficiente que el uso de LINQ.

    • Hola, yo sé, cómo la solución, la pregunta es, si hay un Método integrado para esto. 🙂 Gracias de todos modos!
    • No, usted podría utilizar dic1.FirstOrDefault(Function(kv)kv.Key="Key1"), pero que es muy lento y sin sentido. He añadido que la respuesta pero te aconsejo el próximo año.
    • el punto es que no es una solución ya que ya tienes la llave y sólo se busca el valor. Así que no, no hay builtin método que soporta O(1) búsqueda de rendimiento y devuelve un KeyValuePair por una clave dada.
    • el punto es que yo no soy lookig para el valor, pero el elemento como keyvaluepair POR la clave 🙂 quería evitar definir nuevos KeyvaluePairs sobre la marcha… Ese fue el punto principal… Mediante la definición de temp vars y relleno con información sólo para agregarlos de manera «anónima» es para mí una solución 🙂
    • desde KeyValuePair(Of TKey, TValue) es un tipo de valor(Structure) que siempre están creando nuevos objetos anway(Object.ReferenceEquals siempre devuelve false) incluso si utiliza dict2.Add(0, dict1.First()). Nota al margen: Una ordenados diccionario es también contra el propósito de esta clase 😉

Dejar respuesta

Please enter your comment!
Please enter your name here