2014-01-14 4 views
0

내 개체에는 용어, 제목 및 표시 등 3 개의 필드가 있습니다. 나는 어떤 주제에 대해서 다른 표식을 가진 목록을 갖고 싶다.LinQ에서 두 개의 목록을 비교하여 폭포수 차트 데이터를 얻으십시오.

예 :

첫 번째 목록

Term1, English,90 
Term1, Maths, 60 
Term1, Physics, 30 

두 번째 목록

Term2, English, 95 
Term2,Maths, 60 
Term2, Chemistry, 20 

마지막으로 내가이 원하는

English : +5 
Physics : +30 
Chemistry : -20. 

나는 차이를 얻기 위해 아래 쿼리를 사용하고, 그러나 만약 그것이 실패하면 전자 키 필드 값이 두 목록에서 동일하지 않습니다 (이 경우에 따라) :

var diffData = list1.Union(list2) 
         .GroupBy(m => m.Subject) 
         .Select(d=> 
         { 
          Subject= d.Key, 
          Difference = d.OrderBy(m =>m.Term).Select(s => s.Mark).Aggregate(t1, t2) => t2 - t1) 
         }).Where(m => m.Difference != 0).ToList(); 

+0

당신이 화학은 20 일하고자하는 물리 마십시오 출력 -30 일하기? 그것은 영어가 +5와 더 일관성이있는 것처럼 보입니다. –

+0

@steaks 전체 외부 조인이 필요합니다. 나는 그들의 공통점을 알고 싶다. –

+0

나는 완전한 외부 조인을 원한다는 것을 이해한다. 그러나, 나는 당신이 차이를 어떻게 가져 가고 싶은지 이해하지 못한다. 영어, 물리 및 화학의 차이점을 고려할 때 일관성있는 방법이 없습니다. –

답변

0

는 그것을 단순히 가지고이 방법을 시도 도와주세요 (예를 들어, 목록 2에 존재 - 화학 있지만 목록 1에서)

var Outpt = (from a in List1 
      from b in List2 
      where a.Subject == b.Subject 
      Select new {subject = a.subject , marks = a.marks - b.marks , a.Term}).ToList(); 
+0

@Robert_Junior 당신이 그것을 확인 했습니까 –

+0

@ Co.Aden Nope. 질문을 이해하십시오. 위의 쿼리를 적용하면 물리학, 화학이리스트에서 공통적이지 않으므로 놓치게됩니다. –

1
var diffs = list1.Union(list2) 
    //Create groups where the key is subject and the value is the 
    //list of positive marks for Term2 and negative marks for Term1 
    .GroupBy(c => c.Subject, c => c.Term == "Term2" ? c.Mark : -c.Mark) 
    .Select(s => new 
     { 
      Subject = s.Key, 
      Difference = s.Sum() 
     }) 
    .Where(s => s.Difference != 0); 

var diffs2 = list1.Union(list2) 
    .GroupBy(c => c.Subject) 
    .Select(s => 
     { 
      //For a more general and slighly different algorithm, you can 
      //subtract all the marks for a each subject except the last term 
      //mark from the last term mark (e.g. 95 - 90 for English or 30 - 
      //n/a because there's only one term for Physics 
      var marks = s.OrderByDescending(c => c.Term).Select(c => c.Mark); 
      var lastTermMark = marks.First(); 
      return new 
       { 
        Subject = s.Key, 
        Difference = marks.Skip(1) 
         .Aggregate(lastTermMark, (diff, mark) => diff - mark) 
       }; 
     }) 
    .Where(s => s.Difference != 0); 
관련 문제