2013-02-26 134 views
2

編輯:這是一個示例程序,我明白在linq中有一個sum運算符。但是,我試圖特別詢問如何將指針傳遞給屬性以完成與它相關的複雜操作,而不一定是此求和算法。傳遞一個類屬性的指針

可以說我有一個這樣的類:

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值。由於它們非常相似,所以我希望將它們結合起來,這樣我基本可以通過該列表中的點,並且可以確定我想要執行基於X或Y的計算。

我知道我可以放入一個switch語句,並根據枚舉或者定義的數字來告訴它X或Y是X還是Y,如果這是一個正常的功能,我想我可以使用s委託,但這是一個屬性,所以我不知道如何翻譯。

那麼,如何結合這些功能集成到類似:

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

凡propertyToUse點X或Y的

+1

'PointList'顯然不能是'out'參數。你確定這段代碼好嗎? – jdehaan 2013-02-26 22:55:06

+0

在我的真實程序中,它必須是一個輸出,但對於這個例子,它不會,我會刪除它。 – Xantham 2013-02-26 23:03:12

+0

@Xantham在這種情況下,指針只是一個委託。看到我的答案。 – 2013-02-26 23:05:02

回答

6

目前的解決方案效果很好,但他們假設您的操作是sum,或者您將只有兩個可能的屬性(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 2013-02-26 23:05:25

+0

好。閱讀「Func」和「Action」。 – 2013-02-26 23:06:39

1

我認爲你正在做的太複雜了。您可以使用的方法是這樣的:

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 ySum = pointList.Sum(e => e.y); 
var xSum = pointList.Sum(e => e.x); 
3

你應該看看使用Enumerable.Sum擴展方法,而不是寫你自己的。

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

如果您的代碼文件中尚未存在,則需要添加using System.Linq;