2011-08-17 1 views
0

2 개의 문자열 속성과 몇 개의 이중 속성을 갖는 객체 목록을 갖습니다. 즉, 문자열 속성이 동일하다는 의미에서 중복 행이 있고, 이중 속성이 다릅니다. 이 중복을 하나의 새로운 행에 병합하려고합니다. 이중 행의 값에서 계산됩니다. 간단한 예 :목록의 항목 그룹을 새로운 계산 된 행으로 바꿉니다.

var groups = (from t in MyList group t by new { t.Field1, t.Field2}); 
foreach (var @group in groups) 
{ 
    if (@group.Count() > 1) 
    {   
     var newRow = new MyObject 
         { 
          Field1 = @group.ElementAt(0).Field1, 
          Field2 = @group.ElementAt(0).Field2, 
          Field3 = @group.Average(i => i.Field3) 
         };       
    } 
} 
:

1. A, Text1, 4 (5+3)/2 
2. A, Text2, 4 
3. B, Text1, 7 

이것은 내가 지금 뭘하는지입니다 : 단순 평균으로 '계산 된 행을'촬영

1. A, Text1, 5 
2. A, Text2, 4 
3. B, Text1, 7 
4. A, Text1, 3 

, 내가 끝낼한다

잘 작동합니다. 그룹에 사용할 수있는 remove 메서드가 없으므로 반복되는 그룹의 행을 대체하는 방법을 모르겠습니다. 나는 원래 루프 비교를 위해 중첩 된 중첩 쿠페를 사용하여이 작업을 시도했지만 목록을 수정할 수 없기 때문에 일치하는 인덱스를 반복하여 저장했지만 은 n * (n-1)/2 개의 일치 ...

나는 이것을하기에 완벽하게 간단한 방법이 빠져 있습니까? 나는 그것이 매우 어렵다고 믿을 수는 없지만, 나는 아직 그것을 해결하지 못했다.

답변

1

유사한 brainblock했다 사람에게 유용 할 그것으로 힘을 삭제하기보다는 내 자신의 질문에 대답 :

나는 일을과 복잡함을했다 - 나는 결국 한 단지 만들고있는 새 목록을 반환 새 행 + 처리가 필요없는 행

var groups = (from t in MyList group t by new { t.Field1, t.Field2 }); 
var returnList = new List<MyObject>(); 
foreach (var @group in groups) 
{ 
    returnList.Add(new TradeScore 
         { 
         Field1 = @group.ElementAt(0).Field1, 
         Field2 = @group.ElementAt(0).Field2, 
         Field3 = @group.Average(i => i.Field3) 
         }); 
} 
return returnList; 

Simples.

이 모든 항목에 대해 처리를 수행합니다 (항목 1 개만 포함). 그들은 처리 될 필요가 없지만, 하나의 값의 평균은 분명히 그 값이며, 여분의 if(...) {process and add} else {add}을 피할 수 있습니다. 오버 헤드가 눈에 띄게 될지는 모르겠지만 계속 눈여겨 봐야 할 부분입니다.