2014-11-21 29 views
0

我已經通過很多主題進行了搜索,也找到了一些相關的答案,但是我仍然無法找到解決方案,因此我發佈了這個問題。在多個JSON字符串中查找一個節點的平均值

問題描述

EmployeeResponse1 = [{"Ques":"1","Rating":"7"},{"Ques":"2","Rating":"1"},{"Ques":"3","Rating":"6"},{"Ques":"4","Rating":"1"},{"Ques":"5","Rating":"1"},{"Ques":"6","Rating":"1"},{"Ques":"7","Rating":"7"},{"Ques":"8","Rating":"1"},{"Ques":"9","Rating":"1"},{"Ques":"10","Rating":"1"},{"Ques":"11","Rating":"1"},{"Ques":"12","Rating":"1"},{"Ques":"13","Rating":"1"},{"Ques":"14","Rating":"1"},{"Ques":"15","Rating":"1"},{"Ques":"16","Rating":"10"}] 

EmployeeResponse2 = [{"Ques":"1","Rating":"5"},{"Ques":"2","Rating":"4"},{"Ques":"3","Rating":"7"},{"Ques":"4","Rating":"8"},{"Ques":"5","Rating":"5"},{"Ques":"6","Rating":"9"},{"Ques":"7","Rating":"10"},{"Ques":"8","Rating":"4"},{"Ques":"9","Rating":"9"},{"Ques":"10","Rating":"6"},{"Ques":"11","Rating":"6"},{"Ques":"12","Rating":"6"},{"Ques":"13","Rating":"7"},{"Ques":"14","Rating":"7"},{"Ques":"15","Rating":"9"},{"Ques":"16","Rating":"8"}] 

我在C#這兩個JSON字符串(可以有更多的)。現在我想作最後的JSON字符串,這將是這樣的:

EmployeeResponseAvg = [{"Ques":"1","Rating":"6"},{"Ques":"2","Rating":"2.5"},{"Ques":"3","Rating":"6.5"},{"Ques":"4","Rating":"4.5"},{"Ques":"5","Rating":"3"},{"Ques":"6","Rating":"5"},{"Ques":"7","Rating":"8.5"},{"Ques":"8","Rating":"2.5"},....,{"Ques":"16", "Rating": "9"}] 

像我希望Ques = 1的評級應該是評分(字符串1的問答= 1)和評分(字符串2的問答= 1)的平均值...類似的其他問題

即,類似於FINAL = [{QUES = 1,RATING =(Emp1(Rating.WHERE(QUES = 1),Emp2(Rating.WHERE(QUES = 1),.AVERAGE),........ ............}]

工作至今

模型 - > SurveyResponse.cs

public class SurveyResponse 
{ 
    public string Ques { get; set; } 
    public string Rating { get; set; } 
} 

public class ResponseDataCalls 
{ 
    public static SurveyResponse PutData(string t, string v) 
    { 
     SurveyResponse s = new SurveyResponse(); 
     s.Ques = t; 
     s.Rating = v; 
     return s; 
    } 
} 

的WebAPI RevGroupChartController.cs

代碼的
public class RevGroupChartController : ApiController 
{ 
    private hr_toolEntities _db = new hr_toolEntities(); 

    public object Get(int cid, int gid) 
    { 

     spiderChart obj = new spiderChart(); 

     var group_employees = (from ge in _db.hrt_group_employee 
           where ge.fk_group_id == gid 
           select ge.fk_employee_id).ToList(); 

     List<string> EMP = new List<string>(); 
     List<string> SUP = new List<string>(); 

     List<SurveyResponse> EmpResponse = new List<SurveyResponse>(); 
     List<SurveyResponse> SupResponse = new List<SurveyResponse>(); 

     List<List<SurveyResponse>> tmpEMP = new List<List<SurveyResponse>>(); 
     List<List<SurveyResponse>> tmpSUP = new List<List<SurveyResponse>>(); 

     foreach(var emp in group_employees) 
     { 
      int eid = Convert.ToInt32(emp); 
      var Data = (from d in _db.hrt_cycle_response 
         join g in _db.hrt_cycle_groups on d.hrt_cycle.pk_cycle_id equals g.fk_cycle_id 
         where d.fk_cycle_id == cid && g.fk_group_id == gid && d.fk_employee_id == eid 
         select new 
         { 
          d.response_employee_answers, 
          d.response_supervisor_answers 
         }).First(); 
      EMP.Add(Data.response_employee_answers); 
      SUP.Add(Data.response_supervisor_answers); 
     } 

     foreach(var e in EMP) 
     { 
      //tmpEMP = new JavaScriptSerializer().Deserialize<TEMP>(e); 
      var s = new JavaScriptSerializer(); 
      List<SurveyResponse> em = s.Deserialize<List<SurveyResponse>>(e); 
      tmpEMP.Add(em); 

     } 
     foreach (var s in SUP) 
     { 
      //tmpSUP = new JavaScriptSerializer().Deserialize<TEMP>(s); 
      var e = new JavaScriptSerializer(); 
      List<SurveyResponse> sp = e.Deserialize<List<SurveyResponse>>(s); 
      tmpSUP.Add(sp); 
     } 
     var empl = _db.hrt_questions.Select(x => new { x.question_name }).ToList(); 

     List<int[]> Emprating = new List<int[]>(); 
     //int avgRating; 
     int cnt = 0; 
     foreach(var item in tmpSUP) 
     { 
      int noofQ = item.Count; 
      int[] i = new int[noofQ]; 
      for (int y = 0; y > tmpSUP.Count; y++) 
      { 
       i[y] = Convert.ToInt32(item[cnt].Rating); 
      } 
      Emprating.Add(i); 
      cnt++; 
     } 

     //obj.Employee = Data.response_employee_answers; 
     //obj.Supervisor = Data.response_supervisor_answers; 
     obj.ques = new List<object>(); 
     for (int i = 0; i < empl.Count; i++) 
     { 
      obj.ques.Add(empl[i].question_name); 
     } 

     return obj; 

    } 

    public class TEMP 
    { 
     public List<SurveyResponse> data { get; set; } 
    } 
} 

說明

傳遞一個週期ID和組ID ... 每個組有超過1名僱員和每個員工具有主管 因此,如果說組ID 1023有2名員工。 現在我們有2名員工和2個主管 我們必須爲他們每個人一個JSON記錄

LIKE DB TABLE RESPONSE {fk_emp_id, fk_sup_id, cycle_id, emp_reponse(json), supervisor_response(json)} 

所以我需要作一次員工JSON字符串(其中包含所有評分的平均值) ,一個JSON字符串對於主管(再次,無論是JSONs的平均值) 有可能是任何數量的員工,根據組大小 和每個員工總會有一個主管

總之我要像AA串:

FinalEmployeeResponse = [{'Ques': '1', 'Rating': 'R1'}, {'Ques': '2', 'Rating': 'R2'}, {'Ques': '3', 'Rating': 'R3'}, {'Ques': '4', 'Rating': 'R4'}, ........, {'Ques': '16', 'Rating': 'R16'}] 

這裏,R1 = AVERAGE(Emp1json.Rating.WHERE('Ques' = 1), Emp2json.Rating.WHERE('Ques' = 1), .....)

R2 = AVERAGE(Emp1json.Rating.WHERE('Ques' = 2), Emp2json.Rating.WHERE('Ques' = 2), .....) 

...等等....

期待您的答覆。

我是新的堆棧溢出,如果我錯過了某些東西,請詢問更多細節。

+0

如果還有其他更簡單的方法,那也是可以接受的。 – vohrahul 2014-11-21 05:51:59

回答

0

我找到了一個使用LINQ的1行答案。

double _avg1 = tmpEMP.Select(x => Convert.ToInt32(x.ElementAt(i).Rating)).Average(); 
1

正確的做法是將其解析爲JSON。快速和骯髒的方法是:

static void Main(string[] args) 
    { 
     string json1 = @"[{""Ques"":""1"",""Rating"":""7""},{""Ques"":""2"",""Rating"":""1""},{""Ques"":""3"",""Rating"":""6""},{""Ques"":""4"",""Rating"":""1""},{""Ques"":""5"",""Rating"":""1""},{""Ques"":""6"",""Rating"":""1""},{""Ques"":""7"",""Rating"":""7""},{""Ques"":""8"",""Rating"":""1""},{""Ques"":""9"",""Rating"":""1""},{""Ques"":""10"",""Rating"":""1""},{""Ques"":""11"",""Rating"":""1""},{""Ques"":""12"",""Rating"":""1""},{""Ques"":""13"",""Rating"":""1""},{""Ques"":""14"",""Rating"":""1""},{""Ques"":""15"",""Rating"":""1""},{""Ques"":""16"",""Rating"":""10""}]"; 
     string json2 = @"[{""Ques"":""1"",""Rating"":""5""},{""Ques"":""2"",""Rating"":""4""},{""Ques"":""3"",""Rating"":""7""},{""Ques"":""4"",""Rating"":""8""},{""Ques"":""5"",""Rating"":""5""},{""Ques"":""6"",""Rating"":""9""},{""Ques"":""7"",""Rating"":""10""},{""Ques"":""8"",""Rating"":""4""},{""Ques"":""9"",""Rating"":""9""},{""Ques"":""10"",""Rating"":""6""},{""Ques"":""11"",""Rating"":""6""},{""Ques"":""12"",""Rating"":""6""},{""Ques"":""13"",""Rating"":""7""},{""Ques"":""14"",""Rating"":""7""},{""Ques"":""15"",""Rating"":""9""},{""Ques"":""16"",""Rating"":""8""}]"; 
     string averages = AverageNodes(json1, json2); 

     Console.WriteLine(averages); 
     Console.ReadKey(); 
    } 

    private static string AverageNodes(params string[] json) 
    { 
     var regex = new Regex(@"(""Ques"":""(?<question>\d+)"",""Rating"":""(?<rating>\d+)"")", RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase); 
     var ANUs = regex.Matches(string.Join("", json)) 
      .Cast<Match>() 
      .Select(m => new { Question = m.Groups["question"].Value, Rating = int.Parse(m.Groups["rating"].Value) }) 
      .GroupBy(a => a.Question, a => a.Rating) 
      .Select(a => string.Format("{{\"Ques\":\"{0}\",\"Rating\":\"{1}\"}}", a.Key, a.Average())); 

     return "[" + string.Join(",", ANUs) + "]"; 
    } 
+0

感謝您的回覆。我找到了一個更簡單的答案。 循環編號。 ques,i和double _avg1 = tmpEMP.Select(x => Convert.ToInt32(x.ElementAt(i).Rating))。Average(); – vohrahul 2014-11-21 07:22:52

相關問題