IEnumerable是一個接口,而不是一個類。接口背後的實現定義了它的行爲。
如果在IE上需要調用ToList(),則List實現了該接口,但List> <>,而且IEnumerable爲<>。
將指針存儲爲IEnumerable <>並遍歷它與迭代列表相同。
如果IEnumerable <>是迭代器的結果,則每次訪問IEnumerable <>時都執行該實現。
實施例: 採取以下功能:使用它
public IEnumerable<int> Generator(int max)
{
for (var i = 0; i < max; i++)
{
yield return someExpensiveFunction();
}
}
作爲
var cache = Generator(100);
for (var i = 0; i < 2; i++)
{
foreach (var i in cache)
{
//ops
}
}
這將評估發生器(== IEnumerable的<>)的兩倍。
var cache = Generator(100).ToList();
for(var i = 0; i < 2; i++
{
foreach(var i in cache)
{
//ops
}
}
這將僅評估一次發生器(== IENumerable <>)。
I.E.緩存一個IEnumerable <>是不昂貴的,如果你通過調用ToArray(),ToList()等來使其成爲'具體'。
圓頂附加指導。如果將枚舉轉換爲列表並存儲它們,則最好將存儲變量聲明爲列表。這將它的存儲模型記錄到您的用戶和/或同事。 從一個公共類的功能或屬性的結果/接口應該是收集
class X
{
private List<int> _cache;
public void UpdateCache(IEnumerable<int> items)
{
_cache = items.ToList();
}
public ICollection<T> Cache
{
get{ return _cache; }
}
//even better
public ReadOnlyCollection<T> Items
{
get { return new ReadonlyCollection(_cache); }
}
}
什麼母鹿這個簡單的緩存做的就是從字符串對象的字典不同。 – Paparazzi 2014-08-27 15:18:35