【问题标题】:ContainsKey() dont find an object in DictionaryContainsKey() 在字典中找不到对象
【发布时间】:2011-12-01 11:54:51
【问题描述】:

我是一个家庭作业,我必须实现一些方法。我可以使用上传方法,我必须在元素中上传字典。如果键已经在字典中,我必须更新值。如果键不在字典中,我必须添加该元素。在 Foreach 我可以做到这一点。

在 if 情况下永远不会为真的方法中,只执行 else 情况。 (以其他方式,我尝试if(alcDictionary.Keys==alc) - 但不起作用)。我不知道为什么。有人可以解释我的问题在哪里?为什么从不执行 If 案例。 (总是写“不找到”,而不是“找到”)

我已经用 containsKey() 编写了这个方法:

     public void Upload(Alcohol alc, int dl)
    {
        int d = 0;
        Alcohol s = null;
        if (alcDictionary.ContainsKey(alc))
        {

            Console.WriteLine("I find");
            d = alcDictionary[alc];
            alcDictionary[alc] = d + dl;
        }
        else
        {
            Console.WriteLine("dont find");
            alcDictionary.Add(alc, dl);
        }

使用 Foreach(效果很好!)

            int d = 0;
        Alcohol s = null;
        foreach (var item in alcDictionary)
        {
            if (item.Key.Equals(alc))
            {
                d = item.Value;
                s = item.Key;
            }
        }
        if (s != null)
        {
            alcDictionary[s] = d + dl;
        }
        else
        {
            alcDictionary.Add(alc, dl);
        }

其他一些代码:

    public Kocsma()
    {
        Upload(new Alcohol("Borsodi alc", 160, 4.6), 1000);
        Upload(new Alcohol("Pilsner Urquell", 250, 4.4), 800);
        Upload(new Alcohol("Soproni Ászok", 150, 4.5), 900);
        Upload(new Alcohol("Dreher Classic", 200, 5.2), 600);
    }


    static void Main(String[] args)
    {
        Alcohol b = new Alcohol("Borsodi alc", 160, 4.6); //34
        Alcohol c = new Alcohol("Bratista alc", 230, 4.5); // 51
        Alcohol d = new Alcohol("Soproni Ászok", 150, 4.5); // 33,3

        Kocsma pub = new Kocsma();

        pub.Upload(c, 300);
        pub.Upload(d, 450);
        pub.Upload(b, 100);


    }

【问题讨论】:

    标签: c# dictionary


    【解决方案1】:

    什么是alc?如果它是一个类,您应该覆盖 .Equals 和 .GetHashcode 以使字典正常工作。如果是结构,就不用担心了。

    我很好奇为什么您的第二个版本有效,因为 Item.Key.Equals(alc) 应该表现出相同的行为。

    【讨论】:

    • ` public override bool Equals(object obj) { if (obj is Sör) { Sör other = (Sör)obj;返回 this.név == other.név; } 返回假; }`
    • 那是我的 Equals 方法。但是我们没有了解GetHashcode。这对我来说是新的,也许这就是我的问题
    【解决方案2】:

    您需要在密钥类中正确覆盖 GetHashCode()

    GetHashCode() 必须为相等的对象返回相等的值。

    【讨论】:

    • 他也应该覆盖 Equals。
    • @zmbq:如果你看看他的foreach 例子,很明显他做到了。
    • 不,不是。 Alc 实际上可以是他用来将项目添加到字典中的同一个实例。如果你实现了一个而不是另一个,编译器会警告你,我敢打赌他也没有实现。
    • @zmbq:我相信alc 在这两种情况下都是一样的。
    • 在作业中我实现了equals。但是 getHashCode() 没有,并且必须在没有教授写给我们的情况下实现其他方法......(并且 GetHashCode() 不在程序中,也没有了解)也许这是我的程序问题 :)
    猜你喜欢
    • 1970-01-01
    • 2016-08-25
    • 2012-04-19
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 2016-01-31
    相关资源
    最近更新 更多