【问题标题】:Different outcome after applying ToList()应用 ToList() 后的不同结果
【发布时间】:2012-05-22 11:36:19
【问题描述】:

考虑以下类:

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 有关,但我似乎无法弄清楚。

【问题讨论】:

  • 您的代码目前已经有ToList();我猜你忘了把它拿出来。

标签: c# linq


【解决方案1】:

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

如果没有ToListscores 中的每个项目都会与 foreach 循环交错检查(请参阅:Deferred Execution),该循环修改 externalScores,导致谓词为第一个项目返回 true 和 @ 987654330@ 其他两项。

【讨论】:

  • 我试图弄清楚 为什么 filteredScoresexternalScores 添加了一个项目后返回空 - 我完全错过了所有 RelationId 属性返回 相同的 GUID.
  • 太棒了,没想到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
相关资源
最近更新 更多