我正在创建一个优点函数计算器,对于不熟悉的人来说,它会选择一些属性,并根据这些属性与某些理想值的接近程度(即优点函数)来计算一个值。这使用户可以找到最符合他们要求的项目。
这是我想使用的代码:
public class MeritFunctionLine
{
public Func<CalculationOutput, double> property { get; set; }
public double value { get; set; }
public ComparisonTypes ComparisonType { get; set; }
}
public class MeritFunction
{
public List<MeritFunctionLine> Lines { get; set; }
public double Calculate(CalculationOutput values)
{
double m = 0;
foreach (var item in Lines)
{
m += Math.Abs(values.property - item.value);
}
return m;
}
}
public class CalculationOutput
{
public double property1 { get; set; }
public double property2 { get; set; }
public double property3 { get; set; }
public double property4 { get; set; }
}
显然这段代码无法编译,因为values中不存在名为property的成员,但是这里解释一下我的意图:
- 创建一个新的MeritFunction。
- 向MeritFunction.Lines中添加任意数量的MeritFunctionLines。
- MeritFunctionLine.property应指定在MeritFunction.Calculate中比较的CalculationOutput的哪个属性。
即:
MeritFunction mf = new MeritFunction();
mf.Lines.Add(new MeritFunctionLine() { property = x => x.Property1, value = 90, comparisonType = ComparisonTypes.GreaterThan });
mf.Lines.Add(new MeritFunctionLine() { property = x => x.Property3, value = 50, comparisonType = ComparisonTypes.Equals });
CalculationOutput c1 = new CalculationOutput() { property1 = 1, property2 = 20, property3 = 150, property4 = 500 };
CalculationOutput c2 = new CalculationOutput() { property1 = 15, property2 = 32, property3 = 15, property4 = 45 };
double value1 = mf.Calculate(c1);
double value2 = mf.Calculate(c2);
我不是在问如何将属性作为参数传递给函数,这在C#中是被禁止的。
foreach
循环中使用m += Math.Abs(item.property(values) - item.value);
,就我理解的来看,我并不太清楚问题出在哪里,但这应该可以正常工作。请注意,此处为非官方翻译,仅供参考。 - Medo42comparisonType
。 - sWW