获取字典键对象属性

时间:2014-01-14 11:53:38

标签: c# class object

我正在尝试检索字典的键属性,因为键是一个类。你怎么做呢?这是我使用的课程:

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

所以现在例如如何从这本字典中检索项目的NameSku,或者任何其他属性,如果有的话?

6 个答案:

答案 0 :(得分:1)

要检索您的项目,您需要使用相同的项目(相同的参考)。你可以这样做:

var myDouble = myDictonary[item];

当您将对象用作目录中的键时,其哈希码用于从中添加/检索项目 - 您可以阅读更多here

如果您想使用字符串来检索项目,那么您应该在字典中使用字符串作为键:

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

答案 1 :(得分:1)

首先,如果您想将您的类用作GetHashCode的键,则必须覆盖EqualsDictionary,否则您需要比较参考。

以下是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
}

答案 2 :(得分:0)

你可以像这样迭代字典:

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

然后你将获得所有属性

答案 3 :(得分:0)

您可以使用linq:

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

答案 4 :(得分:0)

您有三种选择。

  1. 您可以使用相同的类实例进行索引,如var x = myDictionary[item]
  2. 您可以实现客户比较器(实现IEqualityComparer<Item>的东西),并将其传递给字典的构造函数。有关详细信息,请参阅MSDN
  3. 您可以在IEquatable<Item>课程上实施Item。有关详细信息,请参阅IEquatable on MSDN

答案 5 :(得分: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);
}