Soy nuevo trabajando con C #, tengo experiencia trabajando con C ++ y Java. Estoy tratando de jugar con los diccionarios, pero realmente no puedo hacer que esto funcione. Tengo dos matrices, el tipo de datos debe ser objetos, después de agregarlos a dos diccionarios diferentes, estoy tratando de encontrar una clave dentro, pero no puedo hacer que vaya a las declaraciones if.Cuál de las dos declaraciones de diccionario es el diccionario correcto1 o dictionary2? Además, ¿cómo puedo encontrar un valor por la clave o una clave por el valor en el diccionario correcto o en ambos?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Practice_With_Dictionaries
{
    class Program
    {
        static void Main(string[] args)
        {


                object[] array1 = new object[5];
                array1[0] = "1111";
                array1[1] = "2222";
                array1[2] = "3333";
                array1[3] = "4444";
                array1[4] = "5555";

                object[] speed = new object[5];
                speed[0] = 1;
                speed[1] = 2;
                speed[2] = 3;
                speed[3] = 4;
                speed[4] = 5;

                object[] keys = new object[1];
                keys[0] = (object[])array1;

                object[] speedTable = new object[1];
                speedTable[0] = (object[])speed;


                Dictionary<object, object> dictionary1 = new Dictionary<object, object>();
                Dictionary<object[], object[]> dictionary2 = new Dictionary<object[], object[]>();


                dictionary1.Add(keys, speedTable);
                dictionary2.Add(keys, speedTable);

                if (dictionary1.ContainsKey((object)"1111"))
                {
                    var method = 1;
                }

                if (dictionary2.ContainsKey(array1))
                {
                    var method = 2;
                }



        }
    }
}
0
Chejua 13 feb. 2017 a las 06:08

2 respuestas

La mejor respuesta

dictionary1.ContainsKey((object)"1111") nunca volverá verdadero porque "1111" se encajonará en un nuevo objeto único cada vez.

Rellene un elemento a la vez

Puede llenar el diccionario un elemento a la vez:

    Dictionary<object, object> dictionary1 = new Dictionary<object, object>();

    for (int i = 0; i < array1.Length; i++)
    {
        dictionary1.Add(array1[i], speed[i]);
    }

    object key1 = array1[0];

    if (dictionary1.ContainsKey(key1))
    {
        var method = 1;
    }

Rellenar usando LINQ

También puede completar el diccionario sin bucles explícitos utilizando LINQ y ToDictionary (IEnumerable , Func ), que crea un diccionario a partir de un IEnumerable de acuerdo con las funciones de selector de clave y selector de elementos especificadas.

Dictionary<object, object> dictionary2 = array1
    .Select((obj, index) => new KeyValuePair<object, object>(array1[index], speed[index]))
    .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

Dictionary<object, object> dictionary3 = array1
    .Select((obj, index) => index)
    .ToDictionary(i => array1[i], i => speed[i]);

Dictionary<object, object> dictionary4 = Enumerable.Range(0,5)
    .ToDictionary(i => array1[i], i => speed[i]);
1
Serge 13 feb. 2017 a las 03:28

El desafío con su código es que está pasando valores clave en forma de matriz o en otros, están usando una lista. Por lo general, inicializamos un diccionario en una relación uno a uno:

Dictionary<object, object> dict = new Dictionary<object, object>();

A veces en una relación de uno a muchos:

Dictionary<object, object[]> dict = new Dictionary<object, object[]>();

En su caso, lo inicializa en una relación de muchos a muchos:

Dictionary<object[], object[]> dictionary2 = new Dictionary<object[], object[]>();

Aunque en su primer ejemplo, particularmente dictionary1, aún pasa una matriz en su valor TKey (vea su código):

Dictionary<object, object> dictionary1 = new Dictionary<object, object>();
dictionary1.Add(keys, speedTable); //the value of keys consists of an object of an array: keys[0] = (object[])array1;

Entonces, su mejor opción es implementar su Diccionario con TKey de un solo objeto y TValue de un objeto o una matriz de objetos o una lista de objetos.

Si aún desea hacer una matriz de objetos, debe implementar un IEqualityComparer personalizado, ya que no puede hacer lo que intenta hacer en sus declaraciones if.

Aquí hay una implementación genérica de muestra, debe proporcionar IEqualityComparer en su Diccionario del constructor:

 public class DictionaryComparer<T> : IEqualityComparer<List<T>>
 {
    public bool Equals(List<T> x, List<T> y)
    {
        //TODO: Your implementation for your contains or equals condition
    }

    public int GetHashCode(List<T> obj)
    {
      //TODO: Implementation of your GetHashCode
    }
 }

Luego impleméntelo:

 if (new DictionaryComparer<object>().Equals(lstCompare, lstCompareTo))
   {
          //TODO: Your condition here..
   }
0
Willy David Jr 13 feb. 2017 a las 08:14