我正在尝试检索字典的键属性,因为键是一个类。你怎么做呢?这是我使用的课程:
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 :(得分:1)
要检索您的项目,您需要使用相同的项目(相同的参考)。你可以这样做:
var myDouble = myDictonary[item];
当您将对象用作目录中的键时,其哈希码用于从中添加/检索项目 - 您可以阅读更多here
如果您想使用字符串来检索项目,那么您应该在字典中使用字符串作为键:
Dictonary<string,double> mydictronary = new Dictonary<string,double>();
答案 1 :(得分: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
}
答案 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)
您有三种选择。
var x = myDictionary[item]
。IEqualityComparer<Item>
的东西),并将其传递给字典的构造函数。有关详细信息,请参阅MSDN。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);
}