看一看下面的例子:ToList()負責調用者或被調用者?
public IEnumerable<LogEntry> GetLogs(string groupName)
{
return _Db.Logs.Where(l => l.groupName == groupName);
}
如果我真的返回此方法之前添加ToList()?或者這是來電者的責任?
看一看下面的例子:ToList()負責調用者或被調用者?
public IEnumerable<LogEntry> GetLogs(string groupName)
{
return _Db.Logs.Where(l => l.groupName == groupName);
}
如果我真的返回此方法之前添加ToList()?或者這是來電者的責任?
如果您在返回之前將添加ToList()
- 它將導致完全枚舉您的enumerable。
如果您將返回IEnumerable
而不是將其轉換爲列表 - 那麼它將首次被調用者枚舉。
因此,如果您的數據大小在_Db.logs
很大 - 可能最好在調用者的大小上枚舉它,因爲調用者不會列舉整個數據集(取決於調用者使用它的計劃)。
將您的IEnumerable轉換爲列表會讓您失去IEnumerable,主要是惰性評估的所有好處。所以,如果你的來電者真的想創建一個列表,讓他,但不要強迫他。
有一些有效的情況,你可能想返回一個被屏蔽爲列表的列表。例如,您從數據庫獲取數據,以便在關閉連接之前檢索所有數據,但不希望通過添加到列表中給調用方留下可能影響未來結果的印象。 – Rawling 2014-10-03 10:34:16
如果您想讓人們選擇何時評估查詢,請返回IEnumerable。如果將IList指定爲返回類型,則必須通過調用ToArray()或ToList()來評估表達式。
我建議使用這種方法。 你應該通過你想要的,不會失去控制數據採集時間。
public List<LogEntry> GetLogs(Expression<Predicate<LogEntry>> where)
{
return _Db.Logs.Where(where).ToList();
}
}
這是什麼都與Java呢?情況如何?這裏沒有「一刀切」的解決方案。 – 2014-10-03 10:22:41
嗯,我認爲更多的是適用於C#或Java的泛型編程問題。但很有可能我錯了;) – 2014-10-03 10:36:43