c# – Dictionary.ContainsKey始终返回False
发布时间:2020-12-15 03:58:37 所属栏目:百科 来源:网络整理
导读:那么我试图创建一个小的应用程序,可以节省一些员工姓名,年龄和工资.所以我决定用Dictionary来设置每个员工的工资,我想出了这个代码 码 var employeeSalaryDictionary = new DictionaryEmployee,int();employeeSalaryDictionary.Add(new Employee { Name = "C
那么我试图创建一个小的应用程序,可以节省一些员工姓名,年龄和工资.所以我决定用Dictionary来设置每个员工的工资,我想出了这个代码
码 var employeeSalaryDictionary = new Dictionary<Employee,int>(); employeeSalaryDictionary.Add(new Employee { Name = "Chuck",Age = 37 },1000); employeeSalaryDictionary.Add(new Employee { Name = "Norris",2000); employeeSalaryDictionary.Add(new Employee { Name = "Rocks",Age = 44 },3000); Employee employeeToFind = new Employee { Name = "Chuck",Age = 37 }; //or even Employee employeeToFind = new Employee { Name = "Chuck"}; //Always False... bool exists = employeeSalaryDictionary.ContainsKey(employeeToFind); 员工班 public class Employee { public string Name { get; set; } public int Age { get; set; } } 然而,正如我发表的评论或主题标题所述,.ContainsKey总是返回False,尽管我尝试了两种方式,如代码所示. 解决方法
您没有使用DictionaryqueryComparer< T>中的Dictionary构造函数.您也没有在Employee类上实现自定义的等式.
所以现在字典是通过参考比较员工.当你新的员工,你有一个不同的参考,即使例如名字可能是一样的 这可能是最简单的方式来实现自己的IEqualityComparer< Employee>,您可以在其中选择哪些成员将用于等式比较,并将其传递给字典的构造函数. 作为承诺,片段: //ReSharper's courtesy public sealed class NameAgeEqualityComparer : IEqualityComparer<Employee> { public bool Equals(Employee x,Employee y) { if (ReferenceEquals(x,y)) return true; if (ReferenceEquals(x,null)) return false; if (ReferenceEquals(y,null)) return false; if (x.GetType() != y.GetType()) return false; return string.Equals(x.Name,y.Name) && x.Age == y.Age; } public int GetHashCode(Employee obj) { unchecked { return ((obj.Name != null ? obj.Name.GetHashCode() : 0) * 397) ^ obj.Age; } } } 接着: var employeeSalaryDictionary = new Dictionary<Employee,int>(new NameAgeEqualityComparer()); employeeSalaryDictionary.Add(new Employee { Name = "Chuck",Age = 37 }; bool exists = employeeSalaryDictionary.ContainsKey(employeeToFind); // true! 为了完整性,这里是唯一的比较器(也是ReSharper的礼貌): public sealed class NameEqualityComparer : IEqualityComparer<Employee> { public bool Equals(Employee x,Employee y) { if (ReferenceEquals(x,y)) return true; if (ReferenceEquals(x,null)) return false; if (ReferenceEquals(y,null)) return false; if (x.GetType() != y.GetType()) return false; return string.Equals(x.Name,y.Name); } public int GetHashCode(Employee obj) { return (obj.Name != null ? obj.Name.GetHashCode() : 0); } } 但是,正如您所注意到的那样,您必须确定在创建字典时将使用哪个比较器进行键比较.以后不能改变… (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- EDB PPAS/PostgreSQL异地容灾,并实现“0数据丢失”的灾难恢
- React Native 实例 - 房产搜索App
- ios – 是否有Xcode的包管理器? (比如NuGet)
- 木偶 – 你如何将一个数组传递给ruby中的erb模板并重复一遍
- cocos2d-x 入门之Director,SceneLayer,Sprite
- ruby-on-rails – 将范围内的自动增量添加到migration-file
- Flex通过IFrame调用JS函数
- 当使用clojure的korma sqlite3助手时,sqlite3数据库的默认路
- React-Native-Popup-Menu和Stack Navigator
- C++算法之哈夫曼树