public class Root
{
public List<Parent> Items;
}
public class Parent
{
public int Id;
public int Type;
public List<Child> Childs;
}
public class Child
{
public int Id;
public int ParentId;
public string Title;
}
Sen en sql fråga som returnerar data som nedan.
ParentId Type ChildId Title
2 100 1 Size 1
2 100 3 Size 4
2 100 8 Size 2
2 100 23 Size 3
6 200 4 Color 2
6 200 5 Color 1
6 200 2 Color 3
7 300 12 Some text
Eftersom min hjärncell försöker lära sig binda blommor så jag skulle jag behöva lite hjälp med logiken för att se till att datan hamnar på rätt ställe.
Något så här:
Per rader med samma dr["ParentId"] så skall på den första raden en Parent(Parent.Id, Parent.Type) skapas. Och den radens Child (Child.Id, Child.Title) skall läggas till i Parent.Childs. Nästkommande rader med samma dr[ParentId"] skall skapa en Child som skall läggas till i den aktuella Parent.Childs.
När det sen blir ett nytt dr["ParentId"] så skall Parent läggas till i Root.Items och sen en loop på detta beteende.
Root r = new Root();
while (dr.Read())
{
Parent p = new Parent();
p.Id = Convert.ToInt32(dr["ParentId"]);
p.Type = Convert.ToInt32(dr["Type"]);
Child c = new Child();
c.Id = Convert.ToInt32(dr["ChildId"]);
c.Title = Convert.ToString(dr["Title"]);
pa.Childs.Add(c);
//And somewhere add to root
r.Items.Add(p);
}
Root r = new Root();
int lastParentId=0;
Parent p;
while (dr.Read())
{
int parentId=Convert.ToInt32(dr["ParentId"]);
if (parentId>lastParentId)
{
p = new Parent();
p.Id = Convert.ToInt32(dr["ParentId"]);
p.Type = Convert.ToInt32(dr["Type"]);
r.Items.Add(p);
}
lastParentId=Convert.ToInt32(dr["ParentId"]);
Child c = new Child();
c.Id = Convert.ToInt32(dr["ChildId"]);
c.Title = Convert.ToString(dr["Title"]);
p.Childs.Add(c);
}
Förutsatt att parentId listas stigande och childId är unikt.
Kom på en lösning i natt som fungerade. Om den är den optimala är väl tveksamt, men den får duga för nu.
Root r = new Root();
Dictionary<int, Parent> col = new Dictionary<int, Parent>();
int x = 0;
while (dr.Read())
{
int parentid = Convert.ToInt32(dr["ParentId"]);
Parent p = new Parent();
p.Id = parentid;
p.Type = Convert.ToInt32(dr["Type"]);
Child c = new Child();
c.Id = Convert.ToInt32(dr["ChildId"]);
c.Title = Convert.ToString(dr["Title"]);
p.Items.Add(c);
if (x != parentid )
{
x = parentid;
col.Add(x, p);
}
else
{
col[x].Items.Add(c);
}
}
r.Items.AddRange(col.Values);
365 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e