2017-04-10 66 views
1

假設我有一個名爲AppChartGroup的表,然後懸掛了幾個子表,它們包含每種類型圖表的參數。所以可能有一個名爲AppBarChart的表和一個名爲AppPieChart的表,每個表具有不同的參數,具體取決於表。都通過ChartGroupId鏈接到AppChartGroup。對我來說問題在於C#方面。我想獲得掛在AppChartGroup上的所有圖表的列表,不管它們是什麼類型。在分鐘,我知道這樣做的唯一方法是這樣的:如何在不知道類型的情況下獲取表格的所有孩子,並返回列表?

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); 
} 

當然必須有這樣做的更雄辯想要什麼?沿着線的東西:

var testChartList = new List<object>(); 

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

但懷疑這是比更容易,LINQ的可能是一條線做工作,可惜我不是在LINQ太好。有沒有人知道這樣做更有效率或更好的方式?

編輯

非常基本的模型。

 AppChartGroup 
     |  |  | 
     |  |  | 
BarChart PieChart LineChart 

EDIT2

順便說一句,我知道,我要問是不可能的 - 我只是詢問是否可能的,但如果你不認爲那麼,請不要猶豫告訴我。

+0

可以顯示chartGroup模式? – CPR43

+1

什麼是孩子的類型?他們是否繼承了一些界面,或者他們都是同一類? – Nino

+0

嘗試類似這樣的:列表 charts = chartGroup.Cast ().Select(x => x).ToList(); – jdweng

回答

0

另一種方法是使用反射。但是這個系統放緩的可能性很高。

 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

似乎它應該工作,但它不。當它在'if'語句內進行時,'var chart'爲空。它沒有得到'prop'類型的圖表列表。 – ailinmcc666

+0

@ ailinmcc666 ..已糾正相同...這是由於方差問題 – CPR43

+0

這也不起作用。它不承認「nameof」。此外,這不是真正的問題 - 它進入'if'語句,它是'var chart',問題是 - 它不是填充'var chart'。 – ailinmcc666

1

您確定要將它們保存爲object?如果你想從一個單一的項目取得的所有圖表,你可以有圖表基類(像ChartBase

var chartGroup = new ChartGroup(); 

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

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

是的,我意識到我可以走這條路 - 有幾種方法可以做到這一點。但是,如果我只想列入清單,獲得所有孩子的最簡單方法是什麼,而不必擔心它們的類型?也許它不能完成? – ailinmcc666

+0

它可以做到。但在你的情況下並不是必需的。您可以通過遵循OOPS原則而不是將東西放在對象中來改善設計。希望這可以幫助。 –

+0

我回答你的問題了嗎? –

0

以下應該做你需要的東西,而不用擔心類型。

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

但我仍然擔心類型 - 我會指定'chartGroup.AppBarCharts'我不想指定我得到的類型,我只是希望所有類型的孩子,不管類型,並放入一個對象的通用列表。就像我說的,我想要像'列表列表= AppChartGroup.Children.toList();' – ailinmcc666

+0

如果你想動態訪問一個類的屬性而不直接調用List屬性,那麼你將不得不使用反射。我可以問爲什麼你不想單獨訪問每個列表?即chartGroup.AppBarCharts。你已經使用foreach循環中的linq節省了很多。這只是更具可讀性......無論如何,linq幾乎都是引擎蓋下的foreach。 – Wheels73

+0

沒有真正的理由不能單獨訪問每個列表,我只是好奇它是否可以一次完成。 – ailinmcc666

0

.AddRange效率較低,但LINQ的版本應該是:

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

根據什麼chartGroup.Children工具,這可能工作:

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

chartGroup.Children不存在。我正在使用它作爲我想要做的一個例子。 – ailinmcc666