考虑这两个返回 IEnumerable 的方法:
private IEnumerable<MyClass> GetYieldResult(int qtResult)
{
for (int i = 0; i < qtResult; i++)
{
count++;
yield return new MyClass() { Id = i+1 };
}
}
private IEnumerable<MyClass> GetNonYieldResult(int qtResult)
{
var result = new List<MyClass>();
for (int i = 0; i < qtResult; i++)
{
count++;
result.Add(new MyClass() { Id = i + 1 });
}
return result;
}
此代码在调用 IEnumerable 的某些方法时显示了 2 种不同的行为:
[TestMethod]
public void Test1()
{
count = 0;
IEnumerable<MyClass> yieldResult = GetYieldResult(1);
var firstGet = yieldResult.First();
var secondGet = yieldResult.First();
Assert.AreEqual(1, firstGet.Id);
Assert.AreEqual(1, secondGet.Id);
Assert.AreEqual(2, count);//calling "First()" 2 times, yieldResult is created 2 times
Assert.AreNotSame(firstGet, secondGet);//and created different instances of each list item
}
[TestMethod]
public void Test2()
{
count = 0;
IEnumerable<MyClass> yieldResult = GetNonYieldResult(1);
var firstGet = yieldResult.First();
var secondGet = yieldResult.First();
Assert.AreEqual(1, firstGet.Id);
Assert.AreEqual(1, secondGet.Id);
Assert.AreEqual(1, count);//as expected, it creates only 1 result set
Assert.AreSame(firstGet, secondGet);//and calling "First()" several times will always return same instance of MyClass
}
当我的代码返回 IEnumerables 时,选择我想要的行为很简单,但是我如何明确定义某个方法获取一个 IEnumerable 作为参数,尽管它调用了多少次“First()”方法,但它创建了一个结果集。
当然,我不想强制不必要地创建所有项目,我想将参数定义为 IEnumerable 表示不会从集合中包含或删除任何项目。
编辑:为了清楚起见,问题不在于产量如何工作或为什么 IEnumerable 可以为每次调用返回不同的实例。问题是当我多次调用“First()”或“Take(1)”等方法时,如何指定参数应该是“仅搜索”集合,该集合返回 MyClass 的相同实例。
有任何想法吗?
提前致谢!