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

时间:2018-01-30 10:31:16

标签: c# linq ienumerable specflow tolist

我有一个"测试"具有IEnumerable具体对象的类

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

public class MyObject
{
    public string Id { get; }


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

调试我的&#34; Steps.cs&#34;我的Specflow功能文件使用的类,我注意到&#34; Id&#34;的值正在改变。 他们的预期与#34;鉴定&#34;步骤,我将这些添加到ScenarioContext

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

当我从&#34;当&#34;中的ScenarioContext中读出它们时,它们被改变了。步骤

[When("I do something")]
public void WhenIDoSomething()
{
    var _test = (MyProject.Entity.Test)ScenarioContext.Current["test"];         
} 

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

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

任何人都可以解释为什么有必要调用&#34; .ToList()&#34;在这里,没有它为什么&#34; Id&#34; &#34; ScenarioContext&#34;中的变化在&#34;给予&#34;之间和&#34;当&#34;步骤

1 个答案:

答案 0 :(得分:2)

如果没有.ToList(),则返回每次迭代时执行的枚举器。 使用.ToList()可以实现枚举器并具有一个具体的列表。

有关更详细的答案,请参阅IEnumerable vs List - What to Use? How do they work?