应用ToList()后的不同结果

时间:2012-05-22 11:36:20

标签: 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();
    }
}

以下功能:

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有关,但我似乎无法解决这个问题。

1 个答案:

答案 0 :(得分:6)

使用ToList,检查scores中的所有项是否与谓词匹配,后者始终为true,因为externalScores为空。

如果没有ToListscores中的每个项都会与foreach循环交叉检查(请参阅:Deferred Execution),这会修改externalScores,从而导致谓词返回true表示第一个项目,false表示其他两个项目。