考虑以下课程:
public class Score
{
private static readonly Guid _relationId = Guid.NewGuid();
public Guid Id { get; set; }
public Guid RelationId { get { return _relationId; } }
public Score()
{
Id = Guid.NewGuid();
}
}
以下功能:
public IEnumerable<Score> GetScores()
{
yield return new Score();
yield return new Score();
yield return new Score();
}
为什么以下函数返回 1 :
public int Execute()
{
var scores = GetScores();
IList<Score> externalScores = new List<Score>();
var filteredScores = scores.Where(score => externalScores.All(x => x.RelationId != score.RelationId));
foreach (var score in filteredScores)
{
externalScores.Add(score);
}
return externalScores.Count();
}
但是当我将.ToList()
添加到filteredScores
时(在foreach循环中或在linq操作之后),函数的结果为 3 。
我怀疑它与Closing over the loop variable有关,但我似乎无法解决这个问题。
答案 0 :(得分:6)
使用ToList
,检查scores
中的所有项是否与谓词匹配,后者始终为true,因为externalScores
为空。
如果没有ToList
,scores
中的每个项都会与foreach
循环交叉检查(请参阅:Deferred Execution),这会修改externalScores
,从而导致谓词返回true
表示第一个项目,false
表示其他两个项目。