请帮我解决这个问题
我创建了一个对象Node
public Node(HashSet<string> _id, double _weight, List<string> _diff, int _depth, HashSet<string> _prefix, int _support)
{
Id = _id;
Weight = _weight;
Diffset = _diff;
Depth = _depth;
Prefix = _prefix;
Support = _support;
Isleaf = false;
Weightsup = _support*_weight;
}
我创建了一个这样的方法并传递三个参数
public Node CreateTailNode(Node _a, Node _b, Double _minsup)
{
Node _child = new Node();
_child.Prefix = _a.Id;
_child.Id = _a.Id.AddRange(_b.Id);
_child.Depth = _a.Depth + 1;
_child.Diffset = _a.Diffset.Except(_b.Diffset).ToList();
_child.Weight = (_a.Weight + _b.Weight)/2;
_child.Support = _a.Support - _child.Diffset.Count;
_child.Weightsup = _child.Support*_child.Weight;
if (_child.Weightsup < _minsup)
{
_child.Isleaf = true;
}
else
{
_child.Isleaf = false;
}
return _child;
}
返回_child之后我意识到Node _a.Prefix也发生了变化并且来到了同一个_child.Prefix
如何在没有Node _a
的更改前缀的情况下创建_child答案 0 :(得分:0)
这里的问题是HashSet
是没有值语义的引用类型,因此复制引用不会创建内容的新副本;引用副本最终引用原始对象。
解决方案是在分配之前制作HashSet
的副本。
_child.Prefix = new HashSet<string>(_a.Id);
我不确定你对_child.Id的意图是什么,但我希望你不得不做类似的事情:
_child.Id = new HashSet<string>(_a.Id);
_child.Id.AddRange(_b.Id);
同样的逻辑必须适用于您可能正在使用的任何其他引用类型;如果你需要一份单独的副本,你必须明确地制作一份。
答案 1 :(得分:0)
我需要将if()条件中的两个HashSet与if(_F1.Prefix == _F2.Prefix) {Do sth. here}
进行比较但结果始终为false。