如果对象具有相同的名称,如何向字典中的键(对象)添加值(C#)

时间:2012-08-31 02:58:32

标签: c# dictionary parameters key

所以,我有一本名为Potions的字典。我需要检查药水中的密钥是否与作为参数传递的对象具有相同的名称。现在我能够做到这一点,但如果item对象和键具有相同的名称,我无法弄清楚如何为该特定键添加值。此代码适用于对象的第一个实例。但是当我添加另一个与键同名的实例对象时,我得到一个未找到密钥的异常。据我所知,2个对象不一样。如何在字典中提取对象引用?或者还有另一种方式吗?

public static void addItem(Potion item)
 {
    if (Potions.Count >0)
    {
        foreach(KeyValuePair<Potion,int> pair in Potions)
        {
            if (pair.Key.itemName == item.itemName)
            {
            containsItem = true;
            }   
        }
        if (containsItem)
        {
        Potions[item] += 1;
        Debug.Log (Potions[item]);
        containsItem = false;
        }
        else
            {       
            Potions.Add(item,1);
            }
    }
    else
    {
    Potions.Add (item,1);
    }

    foreach(KeyValuePair<Potion,int> pair in Potions)
    {
        Debug.Log (pair.Key.itemName + " : " + pair.Value);
    }
 }

4 个答案:

答案 0 :(得分:3)

我实际上会提供另一种实现方式。

enum Potion
{
    Health,
    Mana
}

class PotionBag
{
    readonly int[] _potions = new int[Enum.GetValues(typeof(Potion)).Length];

    public void Add(Potion potion)
    {
        _potions[(int)potion]++;
    }

    public void Use(Potion potion)
    {
        if (GetCount(potion) == 0)
            throw new InvalidOperationException();
        _potions[(int)potion]--;
    }

    public int GetCount(Potion potion)
    {
        return _potions[(int)potion];
    }
}

答案 1 :(得分:1)

由于您正在使用您要添加为关键字的项目而且它不是同一个对象,因此无效。

为什么不在占位符中保存密钥,然后在循环后查找它?

Potion key = null;
foreach(KeyValuePair<Potion,int> pair in Potions)
    {
        if (pair.Key.itemName == item.itemName)
        {
         key = pair.Key
        }   
    }

if(key != null):
    Potions[key] += 1

答案 2 :(得分:1)

您使用Potion作为密钥,但根据您的代码,对您而言重要的是itemName。因此,我建议您将字典更改为<string, int>。另外,如评论所述,使用自定义类时,建议您覆盖EqualsGetHashCode

您的代码可能是这样的:

 public static void addItem(Potion item)
 {
    if(Potions.ContainsKey(item.itemName))
        Potions[item.itemName] += 1;
    else
        Potions.Add (item.itemName,1);

    foreach(KeyValuePair<string,int> pair in Potions)
    {
        Console.WriteLine(pair.Key + " : " + pair.Value);
    }
 }

答案 3 :(得分:1)

您可以覆盖EqualsGetHashCode,但这可能会产生其他影响。相反,您可以在创建字典时使用IEqualityComparer,如下所示:

class Potion {
    public string Name;
    public int Color;
}

class PotionNameEqualityComparer : IEqualityComparer<Potion> {
    public bool Equals(Potion p1, Potion p2) {
        return p1.Name.Equals(p2.Name);
    }
    public int GetHashCode(Potion p1) {
        return p1.Name.GetHashCode();
    }
}

void Main() {
    var d = new Dictionary<Potion, int>(new PotionNameEqualityComparer());
    var p1 = new Potion() { Name = "Health", Color = 1 };
    var p2 = new Potion() { Name = "Health", Color = 2 };
    d.Add(p1, 1);
    d[p2]++; // works, and now you have two health potions. 
             // Of course, the actual instance in the dictionary is p1; 
             // p2 is not stored in the dictionary.    
}