![](/img/trans.png)
[英]Can I make a utility method which takes an arbitrary expression as a parameter and calls it?
[英]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)
(帶有y
的PlayerStats
實例)對其進行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.