2016-03-28 34 views
1

請幫我在這個問題上參數對象也發生了變化時,該方法返回相同類型的對象

我創建了一個對象節點

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後,我意識到,節點_a.Prefix也發生變化,得出了同樣的_child.Prefix

如何創建_child而無需更改節點的前綴_a

+0

_a和_b是引用類型。調用此方法後,這些對象中的任何更改都會出現。查看「_a.Id.AddRange(_b.Id)」語句。 –

回答

0

此處的問題是HashSet是沒有值語義的引用類型,因此,複製引用時不會創建內容的新副本;參考副本最終引用原始對象。

解決方案是在分配之前製作HashSet的副本。

_child.Prefix = new HashSet<string>(_a.Id); 

我不知道你的意圖是_child.Id,但我希望你將不得不做,與類似的東西:

_child.Id = new HashSet<string>(_a.Id); 
_child.Id.AddRange(_b.Id); 

同樣的邏輯也將不得不申請到任何其他您可能正在使用的參考類型;如果你需要一個單獨的副本,你將不得不明確。

+0

「child.Id = _a.Id.AddRange(_b.Id);」 –

+0

請寄給我關於創建單獨的副本並明確指出的說明,我不明白 –

+0

@TùngKiềuVũThanh該行_child.Prefix = new HashSet (_a.Id);'做出單獨的副本。 –

0

我需要比較if()條件中的兩個HashSet的if(_F1.Prefix == _F2.Prefix) {Do sth. here}但是結果總是假的。

+0

你應該爲此提出一個新問題。 –

+0

我達到了極限。 6天后我可以問問。但是,我解決了這個問題。 –

相關問題