c#Dictionary <object,t =“”>查找值

时间:2016-10-27 01:48:41

标签: c# dictionary

不确定如何最好地表达这一点,这可能是我查找困难的原因。这是一个示例控制台应用程序,用于演示我的意思。

class Program
{
    static void Main(string[] args)
    {
        var item1 = new Item("Number");
        var item2 = new Item("Number");

        var dict = new Dictionary<Item, string>();
        dict.Add(item1, "Value");
        Console.WriteLine(dict.ContainsKey(item2));

        var dict2 = new Dictionary<string, string>();
        dict2.Add("Number", "Value");
        Console.WriteLine(dict2.ContainsKey("Number"));
        Console.Read();
    }

    class Item
    {
        readonly string number;
        public Item(string number)
        {
            this.number = number;
        }
    }
}

在此示例中,dict.ContainsKey(item2)返回falsedict2.ContainsKey("Number")返回true。可以通过这样的方式定义项目,使其行为像字符串一样吗?我能想到的最好的是

 static void Main(string[] args)
 {
    var item1 = new Item("Number");
    var item2 = new Item("Number");

    var dict = new Dictionary<string, string>();
    dict.Add(item1.ToString(), "Test");
    Console.WriteLine(dict.ContainsKey(item2.ToString()));
    Console.Read();
}

class Item
{
    readonly string number;

    public Item(string number)
    {
        this.number = number;
    }

    public override string ToString()
    {
        return number;
    }
}

这个例子是设计的,Item会有更多的字段,而ToString()会将它们联合起来。

1 个答案:

答案 0 :(得分:3)

您需要覆盖EqualsGetHashCodeDictionary使用EqualsGetHashCode方法来比较相等的密钥。

class Item
{
    readonly string number;
    public Item(string number)
    {
        this.number = number;
    }

    public override bool Equals(object obj)
    {
        return Equals(obj as Item);
    }

    public override int GetHashCode()
    {
        // this is c# 6 feature 
        return number?.GetHashCode() ?? 0;

        // If you are not using c# 6, you can use
        // return number == null ? 0 : number.GetHashCode();
    }

    private bool Equals(Item another)
    {
        if (another == null)
            return false;

        return number == another.number;
    }
}

如果您有多个字段,则需要考虑EqualsGetHashCode方法中的所有字段。