2009-07-16 11 views
8

객체?내가 클래스가

double xx, yy; 
    for (int i=0; i< ptlist.Count; i++) 
    { 
     xx+=ptlist[i].X; 
     yy+=ptlist[i].Y; 
    } 
    return new PointD(){X=xx, Y=yy}; 

당신은 어떤 내장 LINQ 기능 만 사용할 수 있습니다 for 루프 동등한은 다음과 같이 될 것입니다. 이 함수를 처리하는 확장을 정의 할 수 없습니다.

아이디어가 있으십니까?

편집 : 물론 X 및 Y 구성 요소를 합치기 전에 두 개의 개별 확장 메서드 Sum을 사용하여 합계 할 수 있습니다. 그러나 이것은 내가 원하는 것이 아닙니다. 내가 원하는 작업을

+0

두 합계가 작동하지 않습니까? ptlist와 같은 것 .Sum (p => p.X); and ptlist.Sum (p => p.Y); – albertjan

+0

"LINQ를 사용하여 평균을 얻는 방법".. 나는 당신이 합계가 – James

+0

@the_ajp이라는 것을 의미한다고 생각합니다 : 그것은 효과가 있지만 모든 것을 하나의 쿼리에 담기를 원합니다. – Graviton

답변

13

Aggregate 기능은 여기에 유용하게 사용할 것입니다.

var sum = list.Aggregate((acc, cur) => acc + cur); 
var average = list.Aggregate((acc, cur) => acc + cur)/list.Count; 

그냥 당신이 유형 PointDint에 대해 정의 된 / 연산자를 가지고 있음을 보장하고,이 작업을 수행해야합니다.

참고 : 여기에 합계 또는 평균 (이 질문에 다소 모호함)이 필요한지 여부는 확실치 않지만 두 가지 모두에 대한 예가 포함되어 있습니다.

+0

PointD는 참조 유형이므로 연산자가 구현되는 방법에 따라 여기에서 ArgumentNullException 또는 NullReferenceException을 얻을 수 있습니다. 누적되지 않은 시드를 누적기에 제공 할 가치가 있습니다. –

+0

이것은 좋은 생각이지만, 나는 왜 내가 그것을 생각할 수 없는지 이해하지 못한다. – Graviton

+0

@Greg Beech : 그건 중요한 지적입니다. 나는 그것이 자동적으로'struct' (WPF/System.Drawing의'Point' 형)라고 가정했지만, 클래스로 정의한 것으로 보인다. @Ngu Soon Hui : 다른 이유가 없다면,'PointD' 타입을'struct'로 정의하는 것을 추천합니다. 'Aggregate'는'default (PointD)'를 시드로 사용합니다. 즉, 정상적으로 작동 할 것입니다. – Noldorin

6
당신은 당신이 당신의 자신의 통합 기능을 제공 할 수 있도록 대신 Aggregate 방법을 사용해야합니다

을하는 단일 쿼리/방법 (Sum이 방법의 단지 편리한 전문 경우입니다)입니다. 뭔가 같은 :

points.Aggregate(new PointD(0, 0), (a, p) => a + p); 

난 당신이 추가 방법을 정의하지 않으려는 말을 알고있다, 그러나 이것은 일반적인 작업입니다 만약 내가

public static PointD Sum(this IEnumerable<PointD> source) 
{ 
    return source.Aggregate(new PointD(0, 0), (a, p) => a + p); 
} 
즉,이에 대한 확장 메서드를 작성하는 경향 거라고

훨씬 더 읽기 쉽게 쓸 수이기 때문에 :

points.Sum(); 
+1

그는 이미 'PointD'연산자를 오버로드 했으므로 추가를 재정의 할 필요가 없습니다. – Noldorin

+0

오 예. 그 질문에서 그것을 보지 못했습니다. 좋아, 내가 편집 할게. –

+0

'새로운 PointD (0, 0),'의 목적을 설명해 주시겠습니까? – jxramos

0
[Fact] 
    public void CanAddManyPointDs() 
    { 
     var points = new[]{ 
      new PointD(1,1), 
      new PointD(2,3), 
      new PointD(3,4), 
     }; 

     var result = points.Aggregate((p1, p2) => new PointD(p1.X + p2.X, p1.Y + p2.Y)); 
     Assert.Equal(result.X,6); 
     Assert.Equal(result.Y,8); 
    } 
관련 문제