using System.Collections.Generic;
public Role Child { get { return _child; } set { _child = value; } }
public string Name { get { return _name; } set { _name = value; } }
public Role(string name) { this.Name = name; }
public Role(string name, Role child) { this.Name = name; this.Child = child; }
public override bool Equals(object obj) {
return this.Name.Equals(item.Name);
public override int GetHashCode() {
return base.GetHashCode();
public static void PrintAndReturnChild(Role role)
Console.WriteLine("Name: " + role.Name + "; Depth: " + GetRoleChildrenDepth(role));
PrintAndReturnChild(role.Child);
public static Role GetChild(Role r)
return r.Child == null ? GetChild(r.Child) : r.Child;
public static int GetRoleChildrenDepth(Role r)
return 1 + GetRoleChildrenDepth(r.Child);
public static bool RoleInParentOrChildren(Role role1, Role role2)
else if (role1.Child == null)
return RoleInParentOrChildren(role1.Child, role2);
public static void Main()
List<Role> roles = new List<Role>();
Role roleX = new Role("Parent2", new Role("Child2", new Role("Grandchild2")));
Role role2 = new Role("GreatGrandchild");
Role role1 = new Role("Parent", new Role("Child", new Role("Grandchild", new Role("GreatGrandchild"))));
Role role3 = new Role("Grandchild", new Role("GreatGrandchild"));
Role roleY = new Role("Parent3", new Role("Child3", new Role("Grandchild3")));
roles = roles.OrderByDescending(x => GetRoleChildrenDepth(x)).ToList();
List<Role> filteredRoles = new List<Role>();
for (int i = 1; i < roles.Count; i++)
if (RoleInParentOrChildren(roles[0], roles[i]))
Console.WriteLine("xxxxxx");
foreach(Role r1 in roles)
foreach(Role r2 in roles)
if (!RoleInParentOrChildren(r2, r1) && !filteredRoles.Contains(r1))
Console.WriteLine("uyyyyyyyyyyyyyyy");
foreach(var r in filteredRoles)
Console.WriteLine(RoleInParentOrChildren(new Role("Parent", new Role("Child", new Role("Grandchild", new Role("GreatGrandchild")))), new Role("GreatGrandchild")));