Search code examples
c#dictionaryequalitycontainskey

C# Dictionary ContainsKey


My problem is ContainsKey is always returning false even when they key has been added and .Equals evaluates to true.

I have the following class:

public class StatisticsFilter 
{
    private String someString1;
    private String someString2;
    .....

    public override string ToString()
    {
        return string.Format("{0}-{1}-{2}-{3}-{4}", someString1, someString2, ...)
    }

    public override bool Equals(object obj)
    {            
        return obj.ToString().Equals(ToString());
    }

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

I then have a dictionary that looks like this:

private readonly IDictionary<StatisticsFilter, Statistics> _filteredStatisticsDict =
            new Dictionary<StatisticsFilter, Statistics>();

....

{
    // ALWAYS EVALUATES TO FALSE!
    if (_filteredStatisticsDict.ContainsKey(statisticsFilter) == false)
    {
         _filteredStatisticsDict.Add(statisticsFilter, new Statistics());
    }
}

Solution

  • Unable to reproduce with the code you've given us.

    using System;
    using System.Collections.Generic;
    
    public class StatisticsFilter 
    {
        private String someString1;
        private String someString2;
    
        public StatisticsFilter(string x, string y)
        {
            this.someString1 = x;
            this.someString2 = y;
        }
    
        public override string ToString()
        {
            return string.Format("{0}-{1}xyz", someString1, someString2);
        }
    
        public override bool Equals(object obj)
        {            
            return obj.ToString().Equals(ToString());
        }
    
        public override int GetHashCode()
        {
            return ToString().GetHashCode();
        }
    }
    
    class Test
    {
        static void Main()
        {
            var dict = new Dictionary<StatisticsFilter, int>();
    
            var sf1 = new StatisticsFilter("hello", "there");
            var sf2 = new StatisticsFilter("hello", "there");
    
            dict[sf1] = 10;
            Console.WriteLine(dict.ContainsKey(sf2)); // Prints true
        }
    }