2017-04-10 4 views
1

Angenommen, ich habe eine Tabelle namens AppChartGroup und dann mehrere untergeordnete Tabellen, die die Parameter für jeden Diagrammtyp enthalten. So könnte es eine Tabelle mit dem Namen AppBarChart und eine Tabelle namens AppPieChart geben, die je nach Tabelle unterschiedliche Parameter haben. Beide sind über ChartGroupId mit AppChartGroup verknüpft. Das Problem für mich liegt in der C# -Seite der Dinge. Ich möchte eine Liste aller Diagramme erhalten, die von AppChartGroup hängen, unabhängig davon, um welchen Typ es sich handelt. Am min, der einzige Weg, ich weiß, dies zu tun, ist wie folgt:Wie bekomme ich alle Kinder einer Tabelle, ohne ihren Typ zu kennen, zu einer Liste zurückzukehren?

var testChartList = new List<object>(); 

foreach (var barChart in chartGroup.AppBarChart) 
{ 
    testChartList.Add(barChart); 
} 

foreach (var pieChart in chartGroup.AppPieChart) 
{ 
    testChartList.Add(pieChart); 
} 

foreach (var lineChart in chartGroup.AppLineChart) 
{ 
    testChartList.Add(lineChart); 
} 

Es muss doch ein beredtes will, dies zu tun sein? Etwas entlang der Linien von:

var testChartList = new List<object>(); 

foreach (var childChart in chartGroup.Children) 
{ 
    testChartList.Add(childChart); 
} 

Aber vermutet, es ist sogar noch einfacher als das, wahrscheinlich eine Zeile von Linq macht den Job, ich bin leider nicht so gut an Linq. Kennt jemand einen effizienteren oder besseren Weg dies zu tun?

bearbeiten

Sehr einfaches Modell.

 AppChartGroup 
     |  |  | 
     |  |  | 
BarChart PieChart LineChart 

EDIT2

Btw, ich bin mir bewusst, dass das, was ich frage nicht möglich sein kann - ich frage mich, ob es möglich ist, aber wenn Sie nicht denken, Es ist, dann zögere nicht, mir das zu sagen.

+0

können Sie das Chartgroup-Modell zeigen? – CPR43

+1

Was ist die Art von Kindern? Erben sie irgendeine Schnittstelle oder sind sie alle der gleichen Klasse? – Nino

+0

Versuchen Sie etwas wie folgt: Liste charts = chartGroup.Cast () .Wählen Sie (x => x) .ToList(); – jdweng

Antwort

0

Eine andere Möglichkeit wäre, Reflexion zu verwenden. Aber dies hat eine hohe Chance, das System zu verlangsamen.

 var m = typeof (AppChartGroup).GetProperties().ToList(); 
     List<object> charts= new List<Object>; 
     m.ForEach(prop => 
     { 
      if (prop.PropertyType.GetInterface(nameof(IEnumerable)) !=null) 
      { 
       var chart= prop.GetValue(chartGroup) as IEnumerable<object>;    
       charts.AddRange(data); 
      } 
     }); 
+0

Scheint wie es sollte funktionieren, aber es tut nicht. Wenn es in die 'if' Anweisung tritt, ist 'var chart' null. Es wird nicht die Liste der Diagramme vom Typ 'prop' angezeigt. – ailinmcc666

+0

@ ailinmcc666 .. haben das gleiche korrigiert ... es war aufgrund der Varianz Problem – CPR43

+0

Das funktioniert auch nicht. Es erkennt "nameof" nicht. Auch das war nicht wirklich das Problem - es wurde in die 'if' Anweisung, es war bei 'var chart', dass das Problem war - es war nicht 'var chart' bevölkern. – ailinmcc666

1

Sind Sie sicher, dass Sie sie als object halten möchten? Sie können für die Charts eine Basisklasse haben (wie ChartBase)

Wenn Sie alle Diagramme aus einem einzigen Stück erhalten möchten:

var chartGroup = new ChartGroup(); 

List<ChartBase>testChartList = new List<ChartBase>(); 

testChartList.AddRange(chartGroup.AppBarChart); 
testChartList.AddRange(chartGroup.AppPieChart); 
testChartList.AddRange(chartGroup.AppLineChart); 
+0

Ja, mir ist klar, dass ich diesen Weg gehen kann - es gibt ein paar Möglichkeiten, dies zu tun. Aber wenn ich sie alle nur in einer Liste haben wollte, was ist der einfachste Weg, alle Kinder zu bekommen, ohne sich über ihre Typen Gedanken zu machen? Vielleicht kann es nicht getan werden? – ailinmcc666

+0

Es kann getan werden. Aber es ist nicht notwendig in Ihrer Situation. Sie können Ihr Design verbessern, indem Sie den OOPS-Prinzipien folgen, anstatt Objekte im Objekt zu halten. Hoffe das hilft. –

+0

Habe ich deine Frage beantwortet? –

0

die unten sollte das tun, was Sie brauchen, ohne sich um Arten besorgniserregend.

var testChartList = chartGroup.AppBarCharts.Cast<object>().ToList(); 
testChartList.AddRange(chartGroup.AppPieCharts); 
testChartList.AddRange(chartGroup.AppLineCharts); 
+0

Aber ich mache mir immer noch Sorgen über Typen - ich würde 'chartGroup.AppBarCharts' angeben Ich möchte nicht angeben, welchen Typ ich bekomme, ich möchte nur alle Kinder unabhängig von ihrem Typ, egal welcher Art, und in eine allgemeine Liste von Objekten. Wie ich schon sagte, möchte ich etwas wie 'Liste list = AppChartGroup.Children.toList();' – ailinmcc666

+0

Wenn Sie dynamisch auf Eigenschaften einer Klasse zugreifen möchten, ohne die List-Eigenschaft direkt aufzurufen, müssen Sie reflection verwenden. Kann ich fragen, warum Sie nicht auf jede einzelne Liste zugreifen möchten? d.h. chartGroup.AppBarCharts. Mit linq aus den foreach-Loops haben Sie bereits gute Einsparungen erzielt. Was nur lesbarer ist ... Linq tut so ziemlich alles unter der Haube. – Wheels73

+0

Es gibt keinen wirklichen Grund, warum ich nicht auf jede Liste einzeln zugreifen kann, ich bin nur neugierig geworden, ob es alles auf einmal gemacht werden kann. – ailinmcc666

0

weniger effizient als .AddRange, aber die LINQ-Version sein sollte:

var testChartList = chartGroup.AppBarChart.Concat(chartGroup.AppPieChart) 
              .Concat(chartGroup.AppLineChart).ToList(); 

Je nachdem, was chartGroup.Children implementiert, dies funktionieren könnte:

var testChartList = chartGroup.Children.SelectMany(x => x).ToList(); 
+0

chartGroup.Children existiert nicht. Ich benutzte das als ein Beispiel für das, was ich tun könnte. – ailinmcc666

Verwandte Themen