2012-01-18 88 views
3

我有以下的集合/表動態透視LINQ的C#

Category Type  Detail  Cost 

Auto  Hybrid  AC   80 
Auto  Hybrid  Sunroof 100 
Auto  Standard AC   120 
Motorcycle Standard Radio  60 

有沒有使用LINQ的方式來得到這個轉動到這個樣子?

Category  Type  AC  Radio Sunroof  
Auto   Hybrid 80  0  100 
Auto   Standard 120 0  0 
Motorcycle Standard 0  60  0 

細節是動態的,所以我不能硬編碼linq中的值。

+0

[使用LINQ的數據透視數據](http://stackoverflow.com/questi ons/963491/pivot-data-using-linq) – Magnus 2012-01-18 16:47:31

+1

「細節是動態的」是什麼意思? – dtb 2012-01-18 16:47:49

+0

我的意思是可以隨時添加一個新的細節到表中,所以linq將不得不包含新的細節作爲列 – stillsmallvoice 2012-01-18 16:53:09

回答

2

使用let關鍵字生成的密鑰與group by條款,像這樣:

var query = from item in list 
      let key = new { Category = item.Category, Type = item.Type } 
      group new { Detail = item.Detail, Cost = item.Cost } by key; 

可以遍歷項目從查詢返回像這樣:

foreach(var item in query) { 
    Console.WriteLine("{0} {1}: ", item.Key.Category, item.Key.Type); 
    foreach(var detail in item) { 
     Console.WriteLine("\t{0} {1}", detail.Detail, detail.Cost); 
    } 
} 

它顯示以下輸出

Auto Hybrid: 
     AC 80 
     Sunroof 100 
Auto Standard: 
     AC 120 
Motorcycle Standard: 
     Radio 60 
+0

感謝您的迴應!我正在處理您的查詢,最終輸出將綁定到gridview的源代碼,如我的示例中所示。 – stillsmallvoice 2012-01-18 17:58:36

+0

你知道一個簡單的方法來做到這一點查爾斯?我想我可以在其中爲每個語句創建一個數據表。 – stillsmallvoice 2012-01-18 18:27:53

+0

如果您在添加更多細節值時避免更改UI控件,那麼是的,您將不得不動態創建控件。你可以看看'Aggregate'方法,並傳入一個新的GridView()'作爲種子,並在那裏構建它。這可能比使用循環更容易。 http://msdn.microsoft.com/en-us/library/bb549218.aspx – 2012-01-18 18:53:03