Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.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# 为HashSet实现自定义对象_C#_Hash_Hashcode_Hashset - Fatal编程技术网

C# 为HashSet实现自定义对象

C# 为HashSet实现自定义对象,c#,hash,hashcode,hashset,C#,Hash,Hashcode,Hashset,我使用HashSet实现算法,但是在实现自定义对象时遇到了问题。做一些研究,人们似乎应该: 重写Equals和GetHashCode 不应该用可变对象生成哈希代码是的,这是Java,但我认为实现已经足够接近了 我的实施: //Simplified version of actual class with key components class customObject { public readonly uint column; public readonly char row

我使用HashSet实现算法,但是在实现自定义对象时遇到了问题。做一些研究,人们似乎应该:

重写Equals和GetHashCode 不应该用可变对象生成哈希代码是的,这是Java,但我认为实现已经足够接近了 我的实施:

//Simplified version of actual class with key components
class customObject {
    public readonly uint column;
    public readonly char row;

    public customObject(uint column, char row) {
        this.column = column;
        this.row = row;
    }

    public override bool Equals(object obj) {
        return obj is customObj && !ReferenceEquals(this, obj);
    }

    /*where uint column and char row are readonly. HashSet add is not called
    until these variables are set with their lifetime value.*/
    public override int GetHashCode() {
        unchecked {
            var hashCode = row.GetHashCode();
            hashCode = (hashCode * 397) ^ column.GetHashCode();
            return hashCode;
        }
    }
}

//somwhere else
HashSet<customObject> s = new HashSet<customObject>();
for(int i = 0; i < 10; i++) {
    for(char c = 'A'; c < 'J'; c++) {
        s.add(new customObject((uint)i,c));
    }
 }
不幸的是,我无法将自定义对象添加到哈希集中。正如我可以确认的那样,在尝试添加对象后,HashSet中的项目计数为0。由于集合中没有项目,我怀疑我在实现中遗漏了一些东西,但无法找到有关准备在哈希集合中使用的自定义对象的完整答案/教程

for(char c = 'A'; c < 'A'; c++)
调试器是你的朋友;检查循环状况。那个循环体永远不会运行。此外,在添加对象后,GetHashCode的实现不会导致Count==0,并且不会引发异常。最后,您对Equals的实现是错误的


它确保同一个对象引用不会被视为相等,并且,如果要实现引用相等,那么首先就不需要重写它

首先,你的平等是错误的。第二,当你不发布代码时,你很难看到你的Hashset的问题,顺便说一句:在这里也添加你对象的定义。。。例如:what is row?代码看起来没问题,只是我不确定为什么ReferenceEquals被否定。如何将对象添加到HashSet?你有什么异常吗?@vesan我正在用set.addobj添加请发布真正的工作代码…1。您的代码仍然无法编译。2.如果我修复了所有语法错误,它将按预期工作。张贴您正在运行的显示问题的实际代码。c<'A'是一个错误,我想粘贴另一个更大的值。不幸的是,循环逻辑不是我的代码中的问题。所以你真正的问题仍然是你不想显示实际的代码?