Ich habe eine Klasse, die selbst referenziert ist. IdModuloPai ist der Schlüssel, der auf seine Eltern verweist, und ModulosFilhos ist die Kinder dieses Objekts.C# Position des Objekts rekursiv abrufen
I eine Eigenschaft haben, Profundidade, dass calc rekursiv die Tiefe des Objekts. Eine weitere wichtige Eigenschaft ist Ordem. Es enthält die gewünschte Reihenfolge, die vom Benutzer in diesem Bereich definiert wurde.
Id Nome IdModuloPai Ordem Profundidade OrdemGlobal
1 Root [NULL] 0 0 0
2 Users 1 0 1 1
3 Administration 2 0 2 2
4 Logs 2 1 2 3
5 Customers 1 0 1 4
6 Orders 5 0 2 5
Schauen Sie sich diese Beispieltabelle an.
Ich versuche, eine Funktion ähnlich Profundidade zu erstellen, die seine globale Position berechnet. Ich versuche, die letzte Spalte OrdemGlobal zu bekommen. Dann kann ich Objekte von OrdemGlobal bestellen und es wird immer auf die gleiche Weise in jedem Lokal erscheinen, das ich brauche.
in dieser Tabelle Basierend, ist die korrekte Position
Root
+Users
+Administration
+Logs
+Customers
+Orders
dass Verwaltung vor Logs Schauen apperars weil Verwaltung hat Ordem = 0 und Protokolle hat Ordem 1 =
Wie kann ich das gewünschte Verhalten archieve?
-Code meiner Klasse folgt
public class ModuloModel
{
public int Id { get; set; }
public string Nome { get; set; }
public int Ordem { get; set; }
public virtual int Profundidade {
get
{
return GetDepth(this);
}
}
public int? IdModuloPai { get; set; }
public virtual ModuloModel ModuloPai { get; set; }
public virtual ICollection<ModuloModel> ModulosFilhos { get; set; }
private int GetDepth(ModuloModel moduloModel)
{
if (moduloModel == null) return 0;
if (moduloModel.IdModuloPai == null) return 0;
return GetDepth(moduloModel.ModuloPai) + 1;
}
}
EDIT: Verbesserte Frage
Ich habe versucht so etwas wie
public virtual int OrdemGlobal
{
get
{
return GetGlobalOrder(this);
}
}
private int GetGlobalOrder(ModuloModel moduloModel)
{
if (moduloModel == null) return 0;
if (moduloModel.ModuloPai == null) return 0;
int smallerSiblings = moduloModel.ModuloPai.ModulosFilhos.Where(x => x.Ordem < moduloModel.Ordem).Count();
return (GetGlobalOrder(moduloModel.ModuloPai) + smallerSiblings + 1;
}
Aber dieses ist verwirrt, und kehren nicht die gewünschte Information.
Können Sie ein Beispiel dafür angeben, was GetGlobalOrder zurückgibt? –