ToList()对来电者或被叫者负责?

时间:2014-10-03 10:16:07

标签: c# enumeration

看一下以下示例:

public IEnumerable<LogEntry> GetLogs(string groupName)
{
    return _Db.Logs.Where(l => l.groupName == groupName);
}

我应该在返回此方法之前实际添加ToList()吗?或者这是调用者的责任吗?

4 个答案:

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

}