2016-03-28 29 views
1

ben böyle bir yöntem oluşturduyöntem aynı tip nesne döndüğünüzde parametre nesnesi de

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; 
} 

bir nesne Düğüm yarattı

Bu problemde bana yardımcı ve üç parametre iletin değiştirilir

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; 
} 

dönüş _child sonra ben Düğüm _a.Prefix da değişir olduğunu gerçekleştirmek ve aynı _child.Prefix geldi

Ben Düğüm _A değişimi öneki olmadan _child nasıl oluşturabilirim

+0

_a ve _b referans türleridir. Bu yöntem çağrıldıktan sonra bu nesnelerdeki herhangi bir değişiklik var. "_a.Id.AddRange (_b.Id)" ifadesini gözden geçirin. –

cevap

0

burada mesele HashSet değer semantik olmayan bir başvuru türü böylece içeriğinin yeni bir kopyasını yapmaz referansı kopyalama olmasıdır; Referans kopya, orijinal nesneyi referans alarak biter.

Çözüm, atamadan önce HashSet'un bir kopyasını yapmaktır.

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

Sana _child.Id ile niyet konum ne olduğundan emin değilim ama bununla benzer bir şey yapmak gerekecek bekliyoruz:

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

aynı mantık uygulamak zorunda kalacak Kullanmakta olduğunuz diğer referans türlerine; Ayrı bir kopyasına ihtiyacınız varsa, açık bir şekilde yapmanız gerekir.

+0

"child.Id = _a.Id.AddRange (_b.Id);" –

+0

Lütfen ayrı bir kopyasını oluşturma ve bir tane açık bir şekilde açıklama yapma talimatını gönderin, ben anlamadım –

+0

@ TùngKiềuVũThanh '_child.Prefix = new HashSet (_a.Id);' ayrı bir kopyasını oluşturur. –

0

İki HashSet'i,() koşulunda if(_F1.Prefix == _F2.Prefix) {Do sth. here} ile karşılaştırmalıyım Ancak sonuç her zaman yanlış.

+0

Bunun için yeni bir soru sormalısınız. –

+0

Sınırlara ulaşıyorum. 6 gün sonra sorabilirim. Ancak bunu çözdüm. –

İlgili konular