2014-01-14 2 views
0

Я пытаюсь восстановить свойство ключа диктатора, поскольку ключ является классом. Как ты делаешь это? Вот класс, который я использую:Получить свойства свойства ключа диктатора

public class Item 
{ 
    public int Sku { get; set; } 
    public string Name { get; set; } 

    public Item() 
    { 
    } 
} 

Я пытаюсь извлечь свойство этого, например Name:

Dictionary<Item,double> myDictionary = new Dictionary<Item,double>(); 
Item item = new Item { Sku = 123, Name = "myItem" }; 
myDictionary.Add(item,10.5); 

Так что теперь, например, как из этого словаря я получить позицию элемента Name или Sku или любое другое имущество, если оно будет иметь их?

+0

Используйте метод GET для извлечения имен! –

+2

Вы действительно хотите, чтобы ключ был классом? Зачем? –

+0

что именно вы хотите сделать. –

ответ

1

Во-первых, вы должны переопределить GetHashCode и Equals, если вы хотите использовать класс в качестве ключа в Dictionary, иначе вы сравниваете ссылки.

Вот пример, где Equals проверяет, есть ли у двух предметов то же самое Name.

public class Item 
{ 
    public override int GetHashCode() 
    { 
     return Name == null ? 0 : Name.GetHashCode(); 
    } 

    public override bool Equals(object obj) 
    { 
     if (obj == null) return false; 
     if(object.ReferenceEquals(this, obj)) return true; 
     Item i2 = obj as Item; 
     if(i2 == null) return false; 
     return StringComparer.CurrentCulture.Equals(Name, i2.Name); 
    } 
    // rest of class ... 
} 

Но вопрос непонятен. Вы используете словарь для поиска элементов ключом. Поэтому вы хотите найти значение, предоставив ключ. Это означает, что у вас уже есть ключ, который делает ваш вопрос бессмысленным.

Однако, вы можете цикл словаря, даже если он не сделал для этого:

foreach(var kv in mydictronary) 
{ 
    Item i = kv.Key; 
    // now you have all properties of it 
} 
1

Чтобы получить ваш товар, вам необходимо использовать тот же элемент (та же ссылка). Вы можете сделать это таким образом:

var myDouble = myDictonary[item]; 

При использовании объекта в качестве ключа в каталоге, его хэш-код используется для добавления/извлечения элемента из него - вы можете прочитать больше here

Если вы хотите использовать строку для извлечения элементов, то вы должны использовать строки в качестве ключа в вас словарь:

Dictonary<string,double> mydictronary = new Dictonary<string,double>(); 
+0

это доставит ему значение, которое удваивается – Tal87

+0

хмм, тогда, вероятно, я не понимаю вопроса. –

+0

Насколько я понимаю, mr.energy хочет использовать свойства ключа словаря, а не значение – Tal87

0

вы можете перебирать словарь, как это:

foreach(var keyValuePair in myDictionary) { kvp.Key. }

тогда вы будете получать все свойства

0

Вы можете использовать LINQ:

var item = myDictionary.Where(x => x.Key.Name == "myItem"); 
var item = myDictionary.Where(x => x.Key.Sku == 123); 
0

У вас есть три варианта.

  1. Вы можете использовать тот же экземпляр класса для индексации, что и в var x = myDictionary[item].
  2. Вы можете реализовать клиентский компаратор (что-то, что реализует IEqualityComparer<Item>) и передать его конструктору вашего словаря. Подробнее см. MSDN.
  3. Вы можете реализовать IEquatable<Item> на своем Item классе. Подробнее см. IEquatable on MSDN.
0

Доступ к ключам от Dictionary<TKey, TValue>.Keys.

Из MSDN

// To get the keys alone, use the Keys property. 
Dictionary<string, string>.KeyCollection keyColl = openWith.Keys; 

// The elements of the KeyCollection are strongly typed 
// with the type that was specified for dictionary keys. 
Console.WriteLine(); 
foreach(string s in keyColl) 
{ 
    Console.WriteLine("Key = {0}", s); 
} 
Смежные вопросы