在.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?
我有两个像Object1和的复杂对象Object2.他们有大约5个级别的子对象.
我需要最快的方法来说明它们是否相同.
怎么可以在C#4.0中完成?
我之前从未真正这样做过,所以我希望有人可以告诉我正确实现我的类的Except()和GetHashCode()的重写.
我正在尝试修改类,以便我可以使用LINQ Except()方法.
public class RecommendationDTO{public Guid RecommendationId { get; set; }
public Guid ProfileId { get; set; }
public Guid ReferenceId { get; set; }
public int TypeId { get; set; }
public IList<TagDTO> Tags { get; set; }
public DateTime CreatedOn { get; set; }
public DateTime? ModifiedOn { get; set; }
public bool IsActive { get; set; }
public object ReferencedObject { get; set; }
public bool IsSystemRecommendation { get; set; }
public int VisibilityScore { get; …Run Code Online (Sandbox Code Playgroud) 在Java中,当你想有remove从一个通用的正确对象Collection的remove()方法,你必须执行equals(Object o),并remove()可以在Eclipse中自动生成的方法.该方法的示例如下所示--->.
如何在C#中自动生成该方法(Visual Studio,我在VS2013上)?
也许没有必要让List.Remove()方法正常工作?
如果不能自动地如何参考Equals方法应该是什么样子?我的意思是它应该是什么样子.
是Equals()方法,即使在使用List.Remove(),如果这样你能告诉我怎么Equals()应实行以返回true,如果我们比较相同的对象(在内存地址相同)
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((centerPanel == null) ? 0 : centerPanel.hashCode());
result = prime * result + ((lowerPanel == null) ? 0 : lowerPanel.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if(this == obj)
return true;
if(obj …Run Code Online (Sandbox Code Playgroud) 当我开始使用DDD时,我Equals()在我的实体中创建了比较实体ID的方法.因此,具有相同ID的两个实体对象将被视为相等.
在某些时候我想到了这一点,并发现不同状态的两个实体不应该被认为是相等的,即使它们描述相同的事物(即具有相同的ID).所以现在我对我的实体使用引用相等.
然后,我在马克·西曼(Mark Seemann)的写作中偶然发现了这个答案
如果它们的ID彼此相等,则实体是相等的.
当然,现在,我想知道哪种方法更好.
编辑:请注意,问题不在于是否同时拥有同一实体的两个实例是个好主意.我知道在大多数情况下它可能不是.
我现在开始使用DDD,我已经找到了一个很好的ValueObject实现,但我似乎找不到实体的任何好的实现,我想要一个通用的基本实体类型,它将具有一个ID(规范需要)和实现当前的平等操作.
什么是最优雅的解决方案?
我有一个包含 4 列的数据表,如下所示:
private static DataSet dataSet;
private const string tableName = "MyTable";
private const string columnName1 = "Supplier"; //Column names
private const string columnName2 = "Invoice";
private const string columnName3 = "Item";
private const string columnName4 = "Amount";
Run Code Online (Sandbox Code Playgroud)
我按供应商、发票列对表进行了分组,并使用以下 linq 查询计算了金额的总和:
private static DataTable GroupQueryA(DataTable dataTable)
{
DataTable groupedTable = dataTable.AsEnumerable()
.GroupBy(r => new { Key1 = r.Field<string>(columnName1), Key2 = r.Field<string>(columnName2) })
.Select(g => new GroupSum
{
Key1 = g.Key.Key1,
Key2 = g.Key.Key2,
Sum = g.Sum(x => x.Field<double>(columnName4))
}).PropertiesToDataTable<GroupSum>(); …Run Code Online (Sandbox Code Playgroud) 所有资源显示如何覆盖Equals(object)和GetHashCode()使用数字字段来实现该GetHashCode()方法:
实现Equals方法
Equals和GetHashCode的最佳策略是什么?
为什么在重写Equals方法时重写GetHashCode很重要?
但是,在我的课上,我没有任何数字字段.它是树中的节点,引用其父节点,子节点和接口作为数据:
public class Node
{
private IInterface myInterface;
private Node parent;
private List<Node> children = new List<Node>();
public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType())
{
return false;
}
var node = (Node)obj;
return myInterface == node.myInterface;
}
public override int GetHashCode()
{
???
}
}
Run Code Online (Sandbox Code Playgroud)
我应该用什么设置哈希码?