2017-10-03 29 views
-2

私はツリー構造に変換したいリストを持っています。これを木構造に変換するにはどうすればよいですか?C#(親子リスト)のネストされたリスト

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

そして、私はこのフォーマットで出力したいが:

{ 
    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"; 
    } 
} 

私は、リストのクラスを作成した を手助けしなさいネストされたリストとしてリストデータが欲しいです。私は木構造に変換したいリストを持っています。これを木構造に変換するにはどうすればよいですか?

+0

あなたは 'System.Web.Script.Serialization'を持っていますので、出力としてJsonを期待していますか? –

+0

ネストされたリストタイプのdata.means 1つの質問に複数のオプションがあるので、オプションは質問の対象になるはずです –

+1

Jsonとして 'return hierarcy;'を返すのですか? –

答えて

1

まず者があなたのオブジェクトについて話しましょう:
QuestionDetailsをすることができます。..

QuestionDetailsをなどなどのリストが含まれQuestionDetailsのリストが含まれているはずAnswerQuestionと彼のリストが含まれています。答えはQuestionであってはなりません。

だから、それらのクラスを定義しましょう:今度は[ScriptIgnore]を無視してください!

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

質問のサンプルの初期化:

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

があなたの奇妙な文字列を取得する:

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

JSONシリアライズがどのように簡単なのですか?これは単純な:

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

はあなたusing System.Web.Script.Serialization;を忘れて、あなたは、DLLが不足している場合、光バブルをクリックしないでください。

一つの簡単なラインと、それは次のようになります:

[ 
    { 
     "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" 
     } 
     ] 
    } 
] 

シモンズ:[ScriptIgnore]このプロパティを無視するJavaScriptSerializerを教えてください。