当您不使用 LINQ "ToList()" 和返回 IEnumerable 的 Select() 时,Guid 值会发生变化



我有一个"Test"类,它有一个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"类时,我注意到"Id"的值正在更改。它们在"给定"步骤中符合预期,我将它们添加到场景上下文中

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

当我在"何时"步骤中从场景上下文中读出它们时,它们发生了变化

[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"的值在"给定"和"何时"步骤之间的"场景上下文"中发生变化

不带 .ToList(( 你返回了一个枚举器,每次迭代它时都会执行它。与 .ToList(( 你具体化枚举器并有一个具体的列表。

请参阅 IEnumerable vs List - 使用什么?它们是如何工作的?以获得更详细的答案。

最新更新