【问题标题】:KeyNotFoundException : The given key was not present in the dictionaryKeyNotFoundException : 给定的键不在字典中
【发布时间】:2020-09-20 15:40:53
【问题描述】:

每当我尝试访问字典中的键时,我都会收到KeyNotFoundException

我有一个有字典的PricingRules 类:

public class PricingRules
{
    Dictionary<ItemCode, Money> pricing_rules;

    public PricingRules()
    {
        pricing_rules = new Dictionary<ItemCode, Money>();
        pricing_rules.Add(new ItemCode("A"), new Money(50));
        pricing_rules.Add(new ItemCode("B"), new Money(30));
        pricing_rules.Add(new ItemCode("C"), new Money(20));
        pricing_rules.Add(new ItemCode("D"), new Money(15));
    }

    public void itemScanned(ItemCode itemCode, Money amount)
    {
        amount.Add(pricing_rules[itemCode]);
    }

    public Money AmountForItem(ItemCode itemCode)
    {
        return pricing_rules[itemCode];
    }
}

字典中的键是ItemCode类型的:

public class ItemCode
{
    private readonly string itemCode;

    public ItemCode(string itemCode)
    {
        this.itemCode = itemCode;
    }

    public override int GetHashCode()
    {
        return itemCode.GetHashCode();
    }
}

并且值的类型是Money:

public class Money
{
    private int amount;

    public Money(int amount)
    {
        this.amount = amount;
    }

    public override bool Equals(object obj)
    {
        Money money = (Money)obj;
        return this.amount == money.amount;
    }

    public void Add(object obj)
    {
        Money money = (Money)obj;
        this.amount += money.amount;
    }

    public override int GetHashCode()
    {
        return amount.GetHashCode();
    }
}

我尝试覆盖GetHashCode() 函数以返回类中原始类型的HashCode,但它仍然给出KeyNotFoundException

我写的测试是:

public class PricingRulesShould
{
    [Fact]
    void ReturnValueFiftyWhenKeyIsA()
    {
        Money expected = new Money(50);
        PricingRules pr = new PricingRules();

        ItemCode itemcode = new ItemCode("A");
        Money actual = pr.AmountForItem(itemcode);

        Assert.Equal(expected, actual);
    }
}

【问题讨论】:

  • 你能不能尝试让ItemCode实现IEquatable&lt;ItemCode&gt;

标签: c# .net dictionary keynotfoundexception


【解决方案1】:

Dictionary 访问其元素时,它会查找键是否相等。
由于ItemCode 不是原始类型,因此当您比较new ItemCode("A") == new ItemCode("A") 时,您应该得到false,因为它们是不同 具有相同内容的实例。
你可以做的是通过ItemCode类实现IEquatable&lt;ItemCode&gt;

public class ItemCode : IEquatable<ItemCode>
{
    private readonly string itemCode;

    public ItemCode(string itemCode)
    {
        this.itemCode = itemCode;
    }

    public override int GetHashCode()
    {
        return itemCode != null ? itemCode.GetHashCode() : 0;
    }

    public bool Equals(ItemCode other)
    {
        if (ReferenceEquals(null, other)) return false;
        if (ReferenceEquals(this, other)) return true;
        return string.Equals(itemCode, other.itemCode);
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        if (ReferenceEquals(this, obj)) return true;
        return obj is ItemCode ic && Equals(ic);
    }
}

【讨论】:

    猜你喜欢
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 2018-01-12
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多