使用具有不同属性的字典containskey比较器

时间:2018-06-22 20:53:32

标签: c# dictionary

我试图找到一种适当的方法来在具有class属性的字典中找到键。

例如,请参见下面的代码-由于密钥不是UserServiceData时,ContainsKey并未实现此ContainsKey(string)签名,因此是错误的。

我该如何解决?

class UserServiceData 
{
    string name;
    int someDate;
    int someData1;
}

class B
{
    public static Dictionary<UserServiceData, IClientKdcCallBack> users_list = new Dictionary<UserServiceData, IClientKdcCallBack>;

    void isUserExists(string userName)
    {
        m_users_list.ContainsKey(userName)
    }
}

3 个答案:

答案 0 :(得分:0)

您也可以尝试编写自己的相等比较器。

private class UserServiceDataEqualityComparer : IEqualityComparer<UserServiceData>
{
    public bool Equals(UserServiceData x, UserServiceData y)
    {
        return x.name == y.name;
    }

    public int GetHashCode(UserServiceData obj)
    {
        return obj.name.GetHashCode();
    }
}

然后像这样声明字典。

var list = new Dictionary<UserServiceData, IClientKdcCallBack>(new UserServiceDataEqualityComparer());

然后您可以执行此操作

list.ContainsKey(UserServiceDataObj)

答案 1 :(得分:-1)

假设“ UserServiceData”类的“ name”属性在Dictionary自身内是唯一的,您可以这样做:

users_list.Any(x => x.Key.name == userName);

如果UserServiceData的两个实例存在相同的userName,它将仍然返回true,因此请小心。

答案 2 :(得分:-2)

使用添加

using System.Linq;

然后

public void isUserExists(string userName)
{
   bool result = m_users_list.Keys.Any(x => x.name == userName);
}

请注意,UserServiceData的所有字段都是私有的!要进行这项工作,至少需要将其公开:

 class UserServiceData 
 {
    public string name;
    public int someDate;
    public int someData1;
 }

所以工作代码是:

class UserServiceData
{
    public string Name   { get; set; }
    public int SomeDate  { get; set; }
    public int SomeData1 { get; set; }
}

class B
{
    public static IDictionary<UserServiceData, IClientKdcCallBack> users_list = new Dictionary<UserServiceData, IClientKdcCallBack>();

    public bool isUserExists(string userName)
    {
        return users_list.Keys.Any(x => x.Name.Equals(userName));
    }
}