2016-09-18 2 views
0

Ich habe eine Sammlung mit der folgenden Struktur.Verwenden von Kreuz-Join/Pivot mit Linq

List<QuestionAnswer> answers = new List<QuestionAnswer>(){}; 

class QuestionAnswer 
{ 
    string Question { get; set; } 
    string Answer { get; set; } 
} 

Es ist mit folgenden Daten gefüllt:

Question Answer 
Q1  a 
Q1  b 
Q2  c 
Q2  d 
Q2  e 

Ich muß es folgendes Format konvertieren:

Q1 Q2 
a c 
a d 
a e 
b c 
b d 
b e 

Die Fragen werden erst zur Laufzeit bekannt; Es kann eine Anzahl von Fragen in der Sammlung geben. Ich glaube, ich muss CROSS JOIN die Sammlung an sich selbst und irgendwie Fragen als Header anzeigen (Pivot-Zeilen und Spalten). Ich konnte das Zieldatenformat nicht erstellen. Jede Hilfe wird geschätzt.

Antwort

1

Man könnte so etwas wie dieses

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

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<QuestionAnswer> answers = new List<QuestionAnswer>() { 
       new QuestionAnswer() { Question = "Q1", Answer = "a"}, 
       new QuestionAnswer() { Question = "Q1", Answer = "b"}, 
       new QuestionAnswer() { Question = "Q2", Answer = "c"}, 
       new QuestionAnswer() { Question = "Q2", Answer = "d"}, 
       new QuestionAnswer() { Question = "Q2", Answer = "e"}, 
      }; 

      DataTable dt = new DataTable(); 
      List<string> uniqueQuestions = answers.Select(x => x.Question).Distinct().ToList(); 

      foreach (string question in uniqueQuestions) 
      { 
       dt.Columns.Add(question, typeof(string)); 
      } 

      var groups = answers.GroupBy(x => x.Answer).ToList(); 

      foreach (var group in groups) 
      { 
       DataRow newRow = dt.Rows.Add(); 
       foreach (QuestionAnswer qA in group) 
       { 
        newRow[qA.Question] = qA.Answer; 
       } 
      } 

     } 
    } 
    public class QuestionAnswer 
    { 
     public string Question { get; set; } 
     public string Answer { get; set; } 
    } 
} 

Gewährt Folgendes tun: enter image description here

+0

Sie Dank für diese Lösung für die Bereitstellung. Während es die Daten nicht wie beschrieben ausgibt, gibt es einen guten Einblick, verdient also eine Abstimmung. – Thracian

+0

Die Eingabe wurde nicht zu Ihrer Ausgabe zugeordnet, also tat ich das Beste, was ich konnte. – jdweng