应用ToList()后的不同结果

Lod*_*ijk 3 c# linq

考虑以下课程:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

以下功能:

public IEnumerable<Score> GetScores()
{
    yield return new Score();
    yield return new Score();
    yield return new Score();
}
Run Code Online (Sandbox Code Playgroud)

为什么以下函数返回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();
}
Run Code Online (Sandbox Code Playgroud)

但是,当我添加.ToList()filteredScores(在foreach循环或之后LINQ操作)函数的结果是3.

我怀疑它与关闭循环变量有关,但我似乎无法解决这个问题.

dtb*_*dtb 6

使用ToList,scores如果它们与谓词匹配,则检查所有项目,因为该谓词externalScores 为空,所以返回始终为true .

如果没有ToList,scores则检查每个项目与foreach循环(参见:延迟执行)交错检查,该循环修改externalScores,导致谓词返回true第一个项目和false其他两个项目.