2017-06-20 7 views
-2

Ich habe Datatable wie unten;Austauschen von Zeilen als Spalten

Systime  | Name | Value 
----------------------------- 
01.04.2017 Water  12 
01.04.2017 Bread  14 
01.04.2017 Chair  11 
02.04.2017 Water  25 
02.04.2017 Bread  16 
02.04.2017 Chair  21 

und ich möchte Zeilen mit Spalten wie folgt mit linq oder etc tauschen;

systime | Water | Bread | Chair 
------------------------------- 
01.04.2017  12  14  11 
02.04.2017  25  16  21 
+0

bauen, was Sie –

+0

@BRAHIMKamel Das Problem versucht haben, ist, ich weiß nicht, die Art und Weise. Gesucht viel, aber kein Glück. –

+0

Mögliches Duplikat von [Konvertieren von Zeile zu Spalte in Linq und SQL] (https://stackoverflow.com/questions/17971921/how-to-convert-row-to-column-in-linq-and-sql) – hardkoded

Antwort

2

Hier ist, wie Sie Ihre Pivot-Tabelle

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      DataTable dt = new DataTable(); 
      dt.Columns.Add("Systime", typeof(DateTime)); 
      dt.Columns.Add("Name", typeof(string)); 
      dt.Columns.Add("Value", typeof(int)); 

      dt.Rows.Add(new object[] { DateTime.Parse("01/04/2017"),"Water", 12}); 
      dt.Rows.Add(new object[] { DateTime.Parse("01/04/2017"),"Bread", 14}); 
      dt.Rows.Add(new object[] { DateTime.Parse("01/04/2017"),"Chair", 11}); 
      dt.Rows.Add(new object[] { DateTime.Parse("02/04/2017"),"Water", 25}); 
      dt.Rows.Add(new object[] { DateTime.Parse("02/04/2017"),"Bread", 16}); 
      dt.Rows.Add(new object[] { DateTime.Parse("02/04/2017"),"Chair", 21}); 

      string[] items = dt.AsEnumerable().Select(x => x.Field<string>("Name")).Distinct().ToArray(); 

      DataTable pivot = new DataTable(); 
      pivot.Columns.Add("Systime", typeof(DateTime)); 
      foreach(string item in items) 
      { 
       pivot.Columns.Add(item, typeof(int)); 
      } 

      var groups = dt.AsEnumerable().GroupBy(x => x.Field<DateTime>("Systime")).ToList(); 

      int index = 0; 
      foreach (var group in groups) 
      { 

       DataRow newRow = pivot.Rows.Add(); 
       newRow[0] = group.Key; 
       foreach (string item in items) 
       { 
        newRow[item] = group.Where(x => x.Field<string>("Name") == item).Select(x => x.Field<int>("Value")).Sum(); 
       } 
      } 

     } 
    } 


} 
+0

Danke. Es funktioniert großartig. Wie kann systime jedoch nicht im Raster angezeigt werden und ich sehe int index = 0 und nie verwendet. Warum ist es da? –

+0

Festcode. vergaß diesen einen Schritt. – jdweng

Verwandte Themen