簡體   English   中英

如何制作一個遍歷列表並以要訪問的數據成員作為輸入參數的函數

[英]How can I make a function that loops over a list and takes which data member to access as input parameter

我有一個包含很多不同數據成員的數據類型PlayerStats。 我想計算一個分數,該分數對於每個數據成員都是不同的(下面的情況是statistics.nrOfGoals)。

private double getScore()
{
    double strength = 0;
    foreach (PlayerStats statistics in this.statistics)
    {
        double dateDiff = Math.Abs(nowDate.Subtract(statistics.date).Days / (365.25 / 12));
        dateDiff = Math.Pow(dateDiff, Form1.historyFactor);

        strength += (statistics.nrOfGoals * ValueTable.PointsPerGoals   ) / dateDiff;
    }

    return strength;
}

我如何才能使此函數具有通用性並接受要查看的數據成員,而不是創建許多相似的函數?

就像是

private double getScore(Type type, Type type2)
{
    double strength = 0;
    foreach (PlayerStats statistics in this.statistics)
    {
        double dateDiff = Math.Abs(nowDate.Subtract(statistics.date).Days / (365.25 / 12));
        dateDiff = Math.Pow(dateDiff, Form1.historyFactor);

        strength += (statistics.type * ValueTable.type2) / dateDiff;
    }

    return strength;
}

您可以使用簽名PlayerStats -> Double來給函數提供參數:

private double getScore(Func<PlayerStats,double> type, double type2)
{
    double strength = 0;
    foreach (PlayerStats statistics in this.statistics)
    {
        double dateDiff = Math.Abs(nowDate.Subtract(statistics.date).Days / (365.25 / 12));
        dateDiff = Math.Pow(dateDiff, Form1.historyFactor);

        strength += (type(statistics) * type2) / dateDiff;
    }

    return strength;
}

然后調用:

getScore(x => x.nrOfGoals,ValueTable.PointsPerGoals);

x => x.nrOfGoals是一個lambda表達式 ,它定義某種函數(在這種情況下)將PlayerStats實例作為輸入並返回double

然后,在代碼中,您可以將type視為“函數” /“方法”,並使用type(y) (帶有yPlayerStats實例)對其進行PlayerStats

您可以將屬性名稱作為字符串參數,並使用反射按名稱查找屬性。

您可以將Func<PlayerStats, double>傳遞給函數,例如:

private double getScore(Func<PlayerStats, double> evaluator)
{
    double strength = 0;
    foreach (PlayerStats statistics in this.statistics)
    {
        double dateDiff = Math.Abs(nowDate.Subtract(statistics.date).Days / (365.25 / 12));
        dateDiff = Math.Pow(dateDiff, Form1.historyFactor);

        strength += evaluator(statistics) / dateDiff;
    }

    return strength;
}

然后稱呼它(在您顯示的情況下)

getScore(x => x.nrOfGoals * ValueTable.PointsPerGoals);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM