当您不将 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? 以获得更详细的答案。
我有一个 "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? 以获得更详细的答案。