将指针传递给类属性

时间:2013-02-26 22:52:02

标签: c# properties arguments parameter-passing

编辑:这是一个示例程序,我知道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.

3 个答案:

答案 0 :(得分: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);

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