我有一个c#函数,我作为一个更大的算法的一部分,我设计但是这个函数表现得很奇怪。它使用相同的参数计算多次运行中的适应度的不同结果。我没有看到问题出在哪里。任何开明的建议都会受到欢迎。
private readonly Dictionary<int,decimal>_cache = new Dictionary<int, decimal>(); // lookup cache
private void CalculateFitness(TimeTable timeTable)
{
const int points = 1;
var exams = timeTable.Exams.ToList();
var combinations = exams.Select(x => exams.Where(y => exams.IndexOf(y) > exams.IndexOf(x))
.Select(z => new List<Exam> { x, z }))
.SelectMany(x => x);
var clash = combinations.Where(touple => touple[0].Period.Id == touple[1].Period.Id && touple[0].Date == touple[1].Date && touple[0].Students.Intersect(touple[1].Students).Any());
var clCount = clash.Sum(touple => touple[0].Students.Intersect(touple[1].Students).Count());
var score = clCount == 0 ? timeTable.Exams.Count : timeTable.Exams.Count - clCount;
if (_cache.ContainsKey(score))
{
timeTable.Fitness = _cache[score];
}
else
{
timeTable.Fitness = Math.Abs(decimal.Divide(score, (timeTable.Exams.Count * points))); // Calculate Fitness
_cache.Add(score, timeTable.Fitness);
}
}
答案 0 :(得分:6)
它会返回不同的结果 多次运行相同的参数
这意味着你的功能不是副作用 - 你正在改变或使用全局状态。查找并消除这些,函数应始终返回预期值。
答案 1 :(得分:1)
这个功能似乎依赖于相同的动态数据。方法体会帮助很多。
是什么让你认为不可能对同一个论点有不同的结果?毕竟,C#不是一种功能语言。
答案 2 :(得分:0)
此问题的另一个经典之处是:
foreach (var foo in myFooList)
{
DoSomethingAsync(() => { SomeFunctionToExecute(foo); }
}
(访问修改后的闭包)