我试图找到一种适当的方法来在具有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)
}
}
答案 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));
}
}