在.NET GetHashCode方法中,很多地方都使用.NET 方法.特别是在快速查找集合中的项目或确定相等性时.是否有关于如何GetHashCode为我的自定义类实现覆盖的标准算法/最佳实践,因此我不会降低性能?
鉴于以下课程
public class Foo
{
public int FooId { get; set; }
public string FooName { get; set; }
public override bool Equals(object obj)
{
Foo fooItem = obj as Foo;
if (fooItem == null)
{
return false;
}
return fooItem.FooId == this.FooId;
}
public override int GetHashCode()
{
// Which is preferred?
return base.GetHashCode();
//return this.FooId.GetHashCode();
}
}
Run Code Online (Sandbox Code Playgroud)
我已经覆盖了该Equals方法,因为它Foo代表了Foos表的一行.哪个是覆盖的首选方法GetHashCode?
覆盖为什么重要GetHashCode?
又一个列表比较问题.
List<MyType> list1;
List<MyType> list2;
Run Code Online (Sandbox Code Playgroud)
我需要检查它们是否具有相同的元素,无论它们在列表中的位置如何.每个MyType对象可能在列表中出现多次.是否有内置函数可以检查这个?如果我保证每个元素只在列表中出现一次怎么办?
编辑:伙计们感谢答案,但我忘了添加一些东西,每个元素的出现次数在两个列表上都应该相同.
我想在我的Equals方法中比较几个集合的内容.我有一个词典和一个IList.有没有内置的方法来做到这一点?
编辑:我想比较两个字典和两个IList,所以我认为平等意味着什么是明确的 - 如果两个字典包含映射到相同值的相同键,那么它们是相等的.
我需要确定两个集合是否包含完全相同的元素.排序无关紧要.
例如,这两个数组应该被认为是相等的:
IEnumerable<int> data = new []{3, 5, 6, 9};
IEnumerable<int> otherData = new []{6, 5, 9, 3}
Run Code Online (Sandbox Code Playgroud)
一组不能包含任何不在另一组中的元素.
可以使用内置查询运算符完成吗?考虑到元素的数量可以从几个到几百个,那么实现它的最有效方法是什么?
我有两个数组.例如:
int[] Array1 = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9};
int[] Array2 = new[] {9, 1, 4, 5, 2, 3, 6, 7, 8};
Run Code Online (Sandbox Code Playgroud)
确定它们是否具有相同元素的最佳方法是什么?
我有两个列表如下,我怎么能说他们有相同的元素.订单并不重要.
var list1 = new List<int> {1,2,3};
var list2 = new List<int> {2,1,3};
Run Code Online (Sandbox Code Playgroud)
我怎么能说这些是平等的?我应该编写自己的方法还是有内置的方法?
假设我有两个不同的哈希集,如下所示,我如何检查两个哈希集包含相同的元素,这两个哈希集是相等的,独立于集合中元素的顺序,请指教.. !!
Set set1=new HashSet();
set.add(new Emp("Ram","Trainer",34000));
set.add(new Emp("LalRam","Trainer",34000));
Run Code Online (Sandbox Code Playgroud)
另一个是......
Set set2=new HashSet();
set.add(new Emp("LalRam","Trainer",34000));
set.add(new Emp("Ram","Trainer",34000));
Run Code Online (Sandbox Code Playgroud)
员工pojo是......
class Emp //implements Comparable
{
String name,job;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
int salary;
public Emp(String n,String j,int sal) …Run Code Online (Sandbox Code Playgroud) 我发现我的自我重写Equals()并GetHashCode()经常实现具有相同属性值的业务对象相等的语义.这会导致代码重复写入并且易于维护(属性被添加,并且一个/两个覆盖都不会更新).
代码最终看起来像这样(欢迎对实现的评论):
public override bool Equals(object obj)
{
if (object.ReferenceEquals(this, obj)) return true;
MyDerived other = obj as MyDerived;
if (other == null) return false;
bool baseEquals = base.Equals((MyBase)other);
return (baseEquals &&
this.MyIntProp == other.MyIntProp &&
this.MyStringProp == other.MyStringProp &&
this.MyCollectionProp.IsEquivalentTo(other.MyCollectionProp) && // See http://stackoverflow.com/a/9658866/141172
this.MyContainedClass.Equals(other.MyContainedClass));
}
public override int GetHashCode()
{
int hashOfMyCollectionProp = 0;
// http://computinglife.wordpress.com/2008/11/20/why-do-hash-functions-use-prime-numbers/
// BUT... is it worth the extra math given that elem.GetHashCode() should be well-distributed?
int bitSpreader = 31; …Run Code Online (Sandbox Code Playgroud) 我知道这个非常类似的问题已经被问过很多次了,例如比较两个集合的平等而不管它们中的项目顺序如何,但我正在尝试使用我正在那里阅读的解决方案而且有些东西不起作用......这是我犯的一个愚蠢的错误...请帮忙!
好的,所以,这是我的方案,假设我在代码中创建了以下3个列表:
Dim lst1 as new list(of integer)
Dim lst2 as new list(of integer)
Dim lst3 as new list(of integer)
Run Code Online (Sandbox Code Playgroud)
然后,在代码中,我最终得到了列表中的以下值:
lst1: lst2: lst3:
1 1 2
2 2 3
3 3 4
4 4 5
Run Code Online (Sandbox Code Playgroud)
所以,显然,lst1和lst2是相等的,而lst1和lst3不是,但是我可以在if语句中写入什么代码来验证这一点?
我试过了:
lst1.SequenceEqual(lstXX)
Run Code Online (Sandbox Code Playgroud)
并且对于lst2和lst3都返回True我尝试过:
lst1.Equals(lstXX)
Run Code Online (Sandbox Code Playgroud)
并且对于lst2和lst3都返回False
现在,我知道我可以用代码比较count和lst1.Except(lstXX),但我想知道更多,所以我在这里做错了,更重要的是,最有效的方法是什么?
谢谢!!!
c# ×8
.net ×4
hashcode ×3
linq ×3
collections ×2
equals ×2
list ×2
algorithm ×1
arrays ×1
comparison ×1
gethashcode ×1
hashset ×1
java ×1
overriding ×1
vb.net ×1