编辑:这是一个示例程序,我知道linq中有一个sum运算符。但是,我试图特别询问如何将指针传递给属性来执行复杂的操作,而不一定是这种求和算法。
假设我有一个这样的课程:
class Point
{
double x {get; set;}
double y {get; set;}
}
在我的主程序中我有两个功能。
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.
答案 0 :(得分:6)
当前的解决方案效果很好,但他们认为您的操作是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);
答案 1 :(得分:2)
您应该使用Enumerable.Sum
扩展方法,而不是自己编写。
var sumX = pointList.Sum(item => item.X);
var sumY = pointList.Sum(item => item.Y);
如果您的代码文件中尚未添加using System.Linq;
,则需要添加{。}}。
答案 2 :(得分:0)
我认为你太复杂了。你可以使用这样的方法:
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);