当您不将 LINQ "ToList()" 与 Select() 一起使用 returns IEnumerable 时,Guid 值会发生变化

Guid value changes when you don't use LINQ "ToList()" with Select() that returns IEnumerable

我有一个 "Test" class,它有一个具体对象的 IEnumerable

public class Test
{
    public IEnumerable<MyObject> MyObjects { get; }
}

public class MyObject
{
    public string Id { get; }


    public MyObject(
        string id,
    {
        this.Id = id;
    }
}

调试我的 Specflow 功能文件使用的 "Steps.cs" class 时,我注意到 "Id" 的值正在改变。 它们在 "Given" 步骤中符合预期,我将它们添加到 ScenarioContext

[Given("I have use case (.*)")]
{
    var _test = _retrieveTest.GetMyObjects(useCase);
    ScenarioContext.Current.Add("test", _test); 
}

当我在 "When" 步骤

中从 ScenarioContext 中读取它们时,它们被更改了
[When("I do something")]
public void WhenIDoSomething()
{
    var _test = (MyProject.Entity.Test)ScenarioContext.Current["test"];         
} 

停止更改值的解决方案是在检索对象时使用 LINQ "ToList()" 调用,如下所示:

private IEnumerable<MyObject> GetMyObjects(
        string usecase,
        MyProject.Entity.Test test)
    {
        ...
        return testData.Objects
            .Select(Object => {
                var _id = var _id = Guid.NewGuid();

                return new MyProject.Entity.MyObject(
                    _id);
            }).ToList();
    }

任何人都可以解释为什么有必要在这里调用“.ToList()”而没有它为什么 "Id" 的值在 "ScenarioContext " 中在 "Given" 和 "When"步

如果没有 .ToList(),您将有一个 return 每次迭代时都会执行的枚举器。 使用 .ToList() 可以具体化枚举器并获得具体列表。

请参阅 IEnumerable vs List - What to Use? How do they work? 以获得更详细的答案。