传递一个类属性的指针
编辑:这是一个示例程序,我明白在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的
目前的解决方案效果很好,但他们假设您的操作是sum
,或者您将只有两个可能的属性(X
和Y
)。
如果你想要更多的*,你可以这样做:
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);
我相信这正是我正在寻找的。我会更多关注这个'Func'关键字。非常感谢你。 – Xantham 2013-02-26 23:05:25
好。阅读“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;
。
'PointList'显然不能是'out'参数。你确定这段代码好吗? – jdehaan 2013-02-26 22:55:06
在我的真实程序中,它必须是一个输出,但对于这个例子,它不会,我会删除它。 – Xantham 2013-02-26 23:03:12
@Xantham在这种情况下,指针只是一个委托。看到我的答案。 – 2013-02-26 23:05:02