2017-02-13 2 views
0

Я работаю с C#, у меня есть опыт работы с C++ и java. Я пытаюсь возиться со словарями, но я не могу заставить это работать. У меня есть два массива, тип данных которых должен быть объектами, после того, как я добавлю их в два разных словаря, пытающихся найти ключ внутри, но я не могу заставить его перейти к операторам if.Какой из двух объявлений словаря является правильный словарь1 или словарь2? Также как я могу найти значение с помощью ключа или ключа по значению в правильном словаре или и то, и другое.C# Dealing with Dictionaries

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

Может быть, вам следует использовать '' Int32' или String' как ключи, а не «Объект»? –

ответ

1

dictionary1.ContainsKey((object)"1111") никогда не вернутся так, потому что "1111" будет боксировал в новый уникальный объект каждый раз.

Populate один пункт в то время

Вы можете заполнить словарь один пункт в то время:

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; 
    } 

Заполнить с помощью LINQ

Вы также можете заполнить словарь без явных петель с помощью LINQ и метод ToDictionary(IEnumerable<TSource, Func<TSource, TKey>, Func<TSource, TElement>), который создает словарь из IEnumerable в соответствии с указанным селектором клавиш и функциями селектора элементов.

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]); 
0

Задача с кодом заключается в том, что вы передаете значения ключей в форме массива или в других, они используют список. Обычно мы инициализируем словарь в один к одному отношения с:

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

Иногда в одном для многих отношениях:

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

В вашем случае, вы инициализировать его на многие ко многим:

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

Хотя на первом примере, в частности dictionary1, вы по-прежнему передавать массив на своем значении TKey (см код):

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; 

Итак, ваш лучший снимок - реализовать свой словарь с помощью TKey одного объекта и TValue объекта или массива объекта или списка объектов.

Если вы все еще хотите сделать массив объектов, вам нужно реализовать пользовательский IEqualityComparer, поскольку вы не можете делать то, что вы пытаетесь сделать в своих операторах if.

Вот пример реализации общего, вы должны предоставить IEqualityComparer в конструкторе словарю:

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 
    } 
} 

Затем его реализации:

if (new DictionaryComparer<object>().Equals(lstCompare, lstCompareTo)) 
    { 
      //TODO: Your condition here.. 
    }