2013-02-26 2 views
2

편집 :이 예제 프로그램은 linq에 합계 연산자가 있다는 것을 알고 있습니다. 그러나 필자는 포인터를 속성에 전달하는 방법에 대해 구체적으로 묻기 위해이 합계 알고리즘이 아닌 복잡한 함수를 수행하도록 요청했습니다.클래스 속성에 대한 포인터 전달

내가이 같은 클래스가 있다고 가정하자 :

class Point 
{ 
    double x {get; set;} 
    double y {get; set;} 
} 

내 메인 프로그램에서 내가 2 개 기능을했다

.

double function1(List<Point> PointList) 
{ 
    double sum = 0.0; 
    foreach(Point p in PointList) 
    { 
     sum += p.x; 
    }  
    return sum; 
} 

double function2(List<Point> PointList) 
{ 
    double sum = 0.0; 
    foreach(Point p in PointList) 
    { 
     sum += p.y; 
    }  
    return sum; 
} 

이러한 기능은 하나가 X 값을 합산하고 다른 하나는 Y 값을 합산하는 것을 제외하고 완전히 동일합니다. 이것들이 매우 유사하기 때문에, 나는 기본적으로 Points of List를 전달하고 X 또는 Y 기반의 계산을하고 싶다는 것을 확인하기 위해 그것들을 결합하고 싶습니다.

switch 문을 넣고 열거 형을 기반으로 한 X 또는 Y인지 여부 또는 X 또는 Y를 수행하도록 지정하는 숫자인지 여부를 알 수 있습니다. 정상적인 함수를 사용하려면 대리자를 사용할 수 있다고 가정합니다. 그러나이 속성이 무엇인지, 그래서 어떻게 해석해야할지 모르겠습니다.

는 어떻게 내가 좋아하는 무언가로 그 기능을 결합 않습니다

double bothFunctions(List<Point> PointList, var propertyToUse) 
{ 
    double sum = 0.0; 
    foreach(Point p in PointList) 
    { 
     sum += p.propertyToUse; 
    }  
    return sum; 
} 

경우 X 또는 Y를

+1

'PointList'는 분명히 'out'매개 변수가 될 수 없습니다. 이 코드는 괜찮습니까? – jdehaan

+0

내 실제 프로그램에서, 그것은 밖으로 있어야하지만,이 예제에서는 그렇지 않습니다, 나는 그것을 제거합니다. – Xantham

+0

@Xantham이 경우 포인터는 단지 델리게이트입니다. 내 대답을 보라. –

답변

6

현재 솔루션은 훌륭하지만 작동이 sum이거나 2 가지 가능한 속성 (XY) 만 있다고 가정합니다. 당신이 더 많은 자유를 원하는 경우

, 당신은 할 수 있습니다 :

double function(List<Point> PointList, Func<Point, double> selector) 
{ 
    double sum = 0.0; 
    foreach (Point p in PointList) 
    { 
     sum += selector(p); 
    } 
    return sum; 
} 

그런 다음 당신은 다음과 같이 호출 :

double sumX = function(PointList, p => p.X); 
double sumY = function(PointList, p => p.Y); 

당신이 좋아, 더 복잡한 선택기를 쓸 수 있습니다 :

double sumXY = function(PointList, p => p.X + p.Y); 
+0

나는 이것이 내가 찾고있는 것이라고 정확히 믿는다. 이'Func' 키워드에 대해 더 자세히 살펴 보겠습니다. 고맙습니다. – Xantham

+0

좋습니다. 'Func'과'Action'에 대해 읽어보십시오. –

1

난 당신이 너무 복잡하고 있다고 생각 하나에 propertyToUse 포인트. 이 같은 방법을 사용할 수 있습니다 :

var ySum = pointList.Sum(e => e.y); 
var xSum = pointList.Sum(e => e.x); 
3

당신은 Enumerable.Sum 확장 방법을 사용하는 대신 자신의 기록을보고한다 :

double bothFunctions(List<Point> PointList, bool sumX) 
{ 
    double sum = 0.0; 
    foreach(Point p in PointList) 
    { 
     if (sumX) 
      sum += p.x; 
     else 
      sum += p.y; 
    }  
    return sum; 
} 

또는 단지는 LINQ를 사용합니다.

var sumX = pointList.Sum(item => item.X); 
var sumY = pointList.Sum(item => item.Y); 

코드 파일에 코드가없는 경우 using System.Linq;을 추가해야합니다.

관련 문제