传递一个类属性的指针

问题描述:

编辑:这是一个示例程序,我明白在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

目前的解决方案效果很好,但他们假设您的操作是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

我认为你正在做的太复杂了。您可以使用的方法是这样的:

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); 

你应该看看使用Enumerable.Sum扩展方法,而不是写你自己的。

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

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