2017-10-03 1 views
-2

J'ai une liste que je veux convertir en structure arborescente. Comment puis-je convertir cela en structure arborescente?liste imbriquée dans C# (liste parent et enfant)

QuestionDetails.cs

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.SqlClient; 
using System.Linq; 
using System.Web; 
using System.Web.Script.Serialization; 

public class QuestionDetails 
{ 
    public int QID { get; set; } 
    public int QuestionID { get; set; } 
    public string Question { get; set; } 
    public string Answer { get; set; } 
    public int AnswerType { get; set; } 
    //public string Question { get; set; } 
    public IList<QuestionDetails> ChildLayers { get; private set; } 
    public QuestionDetails() 
    { 
     ChildLayers = new List<QuestionDetails>(); 
    } 

} 


public IList<QuestionDetails> daya() 
{ 
    SqlConnection con = new SqlConnection("Data Source=ADMIN-PC;Initial Catalog=Test;Integrated Security=True"); 
    SqlCommand cmd = new SqlCommand(); // 
    cmd.CommandText = "selectdata"; 
    cmd.Connection = con; 
    cmd.CommandType = CommandType.StoredProcedure; 
    con.Open(); 
    SqlDataAdapter da = new SqlDataAdapter(cmd); 
    DataSet ds = new DataSet(); 
    da.Fill(ds); 
    // da.Fill(ds.Tables["AnswerMaster"]); 
    DataTable DT = new DataTable(); 
    DT = ds.Tables["Table"]; 
    DataTable DT1 = new DataTable(); 
    DT1 = ds.Tables["Table1"]; 

    IList<QuestionDetails> data = ConvertDataTable<QuestionDetails>(DT); 


    IList<QuestionDetails> hierarcy = new List<QuestionDetails>(); 
    //IList<ChildLayers> hierarcy1 = new List<ChildLayers>(); 

    foreach (var layer in data) 
    { 

     var sublayers = data.Where(i => i.QID == layer.QuestionID && i.QID != 0); 

     if (sublayers.Any()) 
     { 
      hierarcy.Add(layer); 
     } 

     foreach (var sublayer in sublayers) 
     { 
      layer.ChildLayers.Add(sublayer);  
     } 
    } 

    return hierarcy; 
} 

Et je veux sortie dans ce format:

{ 
    question id=1 
    Question ="asasaS" 
    { 
     ANSWER="SDASA"; 
     ANSWER="SADSAD"; 
     ANSWER="SADSA"; 
     ANSWER="SADSAD"; 
    } 

    question id=2 
    Question ="XCVXVXCVXC" 
    { 
     ANSWER="SDASA"; 
     ANSWER="SADSAD"; 
     ANSWER="SADSA"; 
     ANSWER="SADSAD"; 
    } 
} 

je veux données de la liste liste imbriquée .please aider j'ai créé la classe pour la liste. J'ai une liste que je veux convertir en structure arborescente. Comment puis-je convertir cela en structure arborescente?

+0

Vous avez 'System.Web.Script.Serialization' attendez-vous un JSON en sortie? –

+0

type de liste imbriquée data.means 1 question a plusieurs options, donc l'option devrait être sous la question –

+1

voulez-vous retourner 'return hierarcy;' comme Json? –

Répondre

1

D'abord nous allons parler de votre objet:
QuestionDetails peut contenir une liste de QuestionDetails qui contient une liste des etc etc ..

QuestionDetails devrait contenir un Question et sa liste de Answer. Et une réponse ne devrait pas être un Question.

Donc définissons la classe: Ignorer le [ScriptIgnore] pour l'instant!

class Question 
{ 
    [ScriptIgnore] 
    public int QID { get; set; } 
    public int QuestionID { get; set; } 
    public string QuestionText { get; set; } 
    public IList<Answer> Answers { get; private set; } 
    public Question() 
    { 
     Answers = new List<Answer>(); 
    } 
    public Question(int questionID, string questionText, IList<Answer> answers) 
    { 
     Answers = answers; 
     QuestionID = questionID; 
     QuestionText = questionText; 
    } 

    public string ToWeirdString() 
    { 
     string sout = $"\tquestion id={QuestionID}\n" + 
         $"\tQuestion =\"{QuestionText}\"\n"; 
     sout += "\t{\n"; 
     foreach (var i in Answers) 
     { 
      sout += $"\t\tANSWER=\"{i.AnswerText}\";\n"; 
     } 
     sout += "\t}\n"; 
     return sout; 
    } 
} 

class Answer 
{ 
    public Answer(string answerText, int answerType) 
    { 
     AnswerText = answerText; 
     AnswerType = answerType; 
    } 

    public string AnswerText { get; set; } 

    [ScriptIgnore] 
    public int AnswerType { get; set; } 
} 

Initialiser d'un échantillon de la question:

List<Question> sample = new List<Question> { 
          new Question(1, "text1", new List<Answer> { 
                 new Answer("Answer 1",1), 
                 new Answer("Answer 2",1), 
                 new Answer("Answer 3",2), 
                 new Answer("Answer 4",1) 
                 } 
             ), 
          new Question(2, "text2", new List<Answer> { 
                 new Answer("Answer 5",1), 
                 new Answer("Answer 6",3), 
                 new Answer("Answer 7",1), 
                 new Answer("Answer 8",4) 
                 } 
             ) 
         }; 

Obtenir votre chaîne bizarre:

var weirdString = "{\n"+string.Concat(sample.Select(x => x.ToWeirdString()+"\n\n"))+"}\n"; 

Comment simple est la sérialisation JSON? Ce simple:

var json = new JavaScriptSerializer().Serialize(sample); 

Ne pas oublier votre using System.Web.Script.Serialization; et cliquez sur la bulle de lumière si vous manquez la dll.

Une ligne simple et il est ressembler à ceci:

[ 
    { 
     "QuestionID":1, 
     "QuestionText":"text1", 
     "Answers":[ 
     { 
      "AnswerText":"Answer 1" 
     }, 
     { 
      "AnswerText":"Answer 2" 
     }, 
     { 
      "AnswerText":"Answer 3" 
     }, 
     { 
      "AnswerText":"Answer 4" 
     } 
     ] 
    }, 
    { 
     "QuestionID":2, 
     "QuestionText":"text2", 
     "Answers":[ 
     { 
      "AnswerText":"Answer 5" 
     }, 
     { 
      "AnswerText":"Answer 6" 
     }, 
     { 
      "AnswerText":"Answer 7" 
     }, 
     { 
      "AnswerText":"Answer 8" 
     } 
     ] 
    } 
] 

Ps: [ScriptIgnore] dire le JavaScriptSerializer d'ignorer cette propriété.