3

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

4

3 回答 3

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);
于 2013-02-26T22:59:57.210 回答
2

您应该考虑使用Enumerable.Sum扩展方法而不是编写自己的方法。

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

using System.Linq;如果您的代码文件中尚未出现,您将需要添加。

于 2013-02-26T22:55:18.020 回答
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);
于 2013-02-26T22:55:08.450 回答