C# 如何检查system.collections.generic.dictionary ContainsValue中的对象值?
我试图使用Dictionary方法ContainsValue,其中Value是一个对象。我正在使用 网络提琴手C# 如何检查system.collections.generic.dictionary ContainsValue中的对象值?,c#,generics,C#,Generics,我试图使用Dictionary方法ContainsValue,其中Value是一个对象。我正在使用 网络提琴手 使用系统; 使用System.Collections.Generic; 公共课程 { 公共静态void Main() { 字典_dic=新字典(); _dic.Add(1,新信息() {Id=1,Name=“Pawan”}); _dic.Add(2,新信息() {Id=2,Name=“Raj”}); _dic.Add(3,新信息() {Id=3,Name=“Shakya”}); Con
使用系统;
使用System.Collections.Generic;
公共课程
{
公共静态void Main()
{
字典_dic=新字典();
_dic.Add(1,新信息()
{Id=1,Name=“Pawan”});
_dic.Add(2,新信息()
{Id=2,Name=“Raj”});
_dic.Add(3,新信息()
{Id=3,Name=“Shakya”});
Console.WriteLine(_dic[1].Name);
控制台写入线(_dic.ContainsKey(1));
Console.WriteLine(_dic.ContainsValue({Id=3,Name=“Shakya”}));//错误
}
公共类信息
{
公共整数Id
{
得到;
设置
}
公共字符串名
{
得到;
设置
}
}
}
向词典添加对象时,您添加的对象类型为Info
。当您运行ContainsValue
试图传入匿名类型时,您需要传入Info
对象,就像将它们添加到字典中一样
Console.WriteLine(_dic.ContainsValue(new Info() {Id = 3, Name = "Shakya"}));
同样,正如Scott Chamberlain在评论中所述,您应该覆盖info类的GetHashCode
和Equals
,以确保它不会尝试比较引用,并实际使用info
类的内容来确定它们是否相等。更改行
Console.WriteLine(_dic.ContainsValue({Id = 3, Name = "Shakya"}));
到
你也可以试试这个
var value = _dic.Where(x => x.Value.Id.Equals(3) && x.Value.Name.Equals("Shakya"));
if (!value.Equals(new KeyValuePair<int,string>()))
{
Console.WriteLine(value);
}
var value=_dic.其中(x=>x.value.Id.Equals(3)和&x.value.Name.Equals(“Shakya”);
如果(!value.Equals(新的KeyValuePair()))
{
控制台写入线(值);
}
您必须覆盖GetHashCode
和Equals
,此外,您还缺少新信息()
公共类程序
{
公共静态void Main()
{
字典_dic=新字典();
_dic.Add(1,新信息()
{Id=1,Name=“Pawan”});
_dic.Add(2,新信息()
{Id=2,Name=“Raj”});
_dic.Add(3,新信息()
{Id=3,Name=“Shakya”});
Console.WriteLine(_dic[1].Name);
控制台写入线(_dic.ContainsKey(1));
WriteLine(_dic.ContainsValue(new Info(){Id=3,Name=“Shakya”}));
}
公共类信息
{
公共整数Id
{
得到;
设置
}
公共字符串名
{
得到;
设置
}
公共覆盖int GetHashCode(){
返回Id;
}
公共覆盖布尔等于(对象对象对象)
{
if(obj.GetType()==typeof(Info))
{
信息i=对象作为信息;
返回i!=null&&i.Id==Id&&i.Name==Name;
}
返回false;
}
}
}
您没有覆盖信息的Gethashcode和Equals。此外,如果您在代码中发现自己在字典中使用ContainsValue,则可能使用了错误的数据结构,您必须将new Info(){Id=3,Name=“Shakya”}
放在其中,它将返回false。如何获得真正的价值?能否请您澄清文档中哪些部分不清楚?对我来说,它清楚地说明了如何将对象与默认比较器进行比较,并提到以下内容“…它返回一个EqualityComparer
,该比较器使用由T提供的Object.Equals和Object.GetHashCode重写”代码返回false@PAWANRAJShakya已更新解决方案。您的代码返回false。如何获得真正的回报?在Equals
中使用as
更为惯用Info i=obj as Info
并检查结果是否为空。@EvanFrisch刚刚更改,谢谢
Console.WriteLine(_dic.ContainsValue(new Info(){Id = 3, Name = "Shakya"}));
var value = _dic.Where(x => x.Value.Id.Equals(3) && x.Value.Name.Equals("Shakya"));
if (!value.Equals(new KeyValuePair<int,string>()))
{
Console.WriteLine(value);
}
public class Program
{
public static void Main()
{
Dictionary<int, Info> _dic = new Dictionary<int, Info>();
_dic.Add(1, new Info()
{Id = 1, Name = "Pawan"});
_dic.Add(2, new Info()
{Id = 2, Name = "Raj"});
_dic.Add(3, new Info()
{Id = 3, Name = "Shakya"});
Console.WriteLine(_dic[1].Name);
Console.WriteLine(_dic.ContainsKey(1));
Console.WriteLine(_dic.ContainsValue(new Info(){Id = 3, Name = "Shakya"}));
}
public class Info
{
public int Id
{
get;
set;
}
public string Name
{
get;
set;
}
public override int GetHashCode(){
return Id;
}
public override bool Equals(object obj)
{
if(obj.GetType()==typeof(Info))
{
Info i = obj as Info;
return i != null && i.Id == Id && i.Name == Name;
}
return false;
}
}
}