3

編集: これはサンプルプログラムです。linqに合計演算子があることを理解しています。ただし、必ずしもこの加算アルゴリズムではなく、ポインターをプロパティに渡して複雑なことを行う方法について具体的に尋ねようとしていました。

次のようなクラスがあるとしましょう。

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 を実行するように定義された数値かを伝えることができることを知っています。これが通常の関数である場合、私はデリゲートを使用できるとしますが、これはプロパティであるため、どのように変換されるかわかりません。

では、これらの関数を次のようなものに組み合わせるにはどうすればよいですか。

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現在のソリューションはうまく機能しますが、操作がであるか、可能なプロパティが 2 つしかない (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);
于 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 に答える