3

次のクラスを検討してください。

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

しかし、( foreach ループ内または linq 操作の後に)を追加.ToList()すると、関数の結果は3になります。filteredScores

Closing over the loop variableと関係があると思われますが、これを理解できないようです。

4

1 に答える 1

6

を使用ToListすると、 のすべての項目scoresが述語に一致するかどうかがチェックされます。述語externalScores は空であるため、常に true を返します。

がないToList場合、 の各項目は、を変更するループ (「遅延実行scores」を参照)とインターリーブされてチェックされ、最初の項目と他の 2 つの項目の述語が返されます。foreachexternalScorestruefalse

于 2012-05-22T11:40:46.197 に答える