2017-04-07 190 views
2

对于TreeList的一个给定实例,如何检查要添加到第一个TreeList的TreeList的另一个实例是否包含对第一个TreeList本身的引用(可能是间接引用)(这会创建循环引用)?C#如何检测循环引用?

例如:

TreeList T1 = new TreeList(); 
TreeList T2 = new TreeList(); 
TreeList T3 = new TreeList(); 
T1.add(T2); 
T2.add(T3); 
T3.add(T1); 

因为当我通过这个我会陷入一个循环,iterrate因为T3后,我还是会回到T1。那么如何检查订单中是否已包含一个。

class TreeList 
{ 
    public string Name { get; set; } 
    List<TreeList> items = new List<TreeList>(); 
    public ReadOnlyCollection<TreeList> Items 
    { 
     get { return items.AsReadOnly(); } 
    } 

    public TreeList(string Name) 
    { 
     this.Name = Name; 
    } 

    public void Add(string item) 
    { 
     items.Add(new TreeList(item)); 
    } 
    public void Add(TreeList subTree) 
    { 
     items.Add(subTree); 
    } 
    public override string ToString() 
    { 
     return Name; 
    } 
} 
+0

但是,让我们说,我有T1,T2,T3和T4。当我加T4到T3和T3到T2和T2到T1。如果T1未包含在行中,我将如何检查实例T4? – Silent3241

+1

您还需要包括如何遍历它们。 – Evk

+0

'if(!subTree.Equals(this))'? – ThePerplexedOne

回答

0

试试这个方法recoursive:

static void Main(string[] args) 
{ 
    TreeList T1 = new TreeList(""); 
    TreeList T2 = new TreeList(""); 
    TreeList T3 = new TreeList(""); 

    T1.Add(T2); 
    T2.Add(T3); 

    bool result = Contains(T1, T2); // test 1- true 
    bool result2 = Contains(T2, T1); // test 2 - false 
    bool result3 = Contains(T3, T2); // test 3 - false 
} 

public static bool Contains(TreeList source, TreeList searchedElement) 
{ 
    if (source.Equals(searchedElement) || source.Items.Contains(searchedElement)) 
     return true; 

    foreach (TreeList tList in source.Items) 
    { 
     if (tList.Items.Count > 0 && Contains(tList, searchedElement)) 
      return true; 
    } 

    return false; 
} 
+0

除了使用'Any'外,您还可以在集合中使用内置的'Contains'。这将会更加有效。即:'T2.Items.Contains(T1)' –

+0

谢谢@MichaelCoxon,我已经更新了我的答案。 – daniell89

+0

小心'包含(T1,T1)' – grek40

2

我认为这些方法将工作:

public bool ContainsRecursively(TreeList node) 
{ 
    foreach (TreeList child in items) 
     if (child == node || child.ContainsRecursively(node)) 
      return true; 

    return false; 
} 
public void Add(TreeList tree) 
{ 
    if (this == tree) return; // this tree is 'tree', don't add ourselves! 
    if (this.ContainsRecursively(tree)) return; // 'tree' is already in this tree 
    if (tree.ContainsRecursively(this)) return; // this tree is already in 'tree' 
    items.add(tree); 
}