Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检查system.collections.generic.dictionary ContainsValue中的对象值?_C#_Generics - Fatal编程技术网

C# 如何检查system.collections.generic.dictionary ContainsValue中的对象值?

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

我试图使用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”});
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;
        }
    }
}