看一下以下示例:
public IEnumerable<LogEntry> GetLogs(string groupName)
{
return _Db.Logs.Where(l => l.groupName == groupName);
}
我应该在返回此方法之前实际添加ToList()吗?或者这是调用者的责任吗?
答案 0 :(得分:2)
如果您在返回前添加ToList()
,则会导致您的可枚举的完整枚举。
如果您将返回IEnumerable
而不是将其转换为列表 - 那么首次使用它时,调用者将对其进行枚举。
因此,如果_Db.logs
中的数据大小很大 - 可能最好在调用者的大小上枚举它,因为调用者不会枚举整个数据集(取决于调用者计划用它做什么)。
答案 1 :(得分:1)
将您的IEnumerable转换为List会让您丧失使用IEnumerable(主要是懒惰的评估)的所有好处。所以,如果你的来电者真的想要创建一个List,那就让他吧,但不要强迫他去。
答案 2 :(得分:0)
如果要允许人们选择何时评估查询,请返回IEnumerable。如果将IList指定为返回类型,则必须通过调用ToArray()或ToList()来计算表达式。
答案 3 :(得分:0)
我建议使用这种方法。 你应该通过你想要的东西,不要失去对数据采集时间的控制。
public List<LogEntry> GetLogs(Expression<Predicate<LogEntry>> where)
{
return _Db.Logs.Where(where).ToList();
}
}