ToList()对调用者或被调用者的责任

本文关键字:被调用者 责任 调用者 ToList | 更新日期: 2023-09-27 18:25:29

看看下面的例子:

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

在返回此方法之前,我是否应该添加ToList()?还是这是来电者的责任?

ToList()对调用者或被调用者的责任

如果在返回之前添加ToList(),将导致枚举对象的完全枚举

如果您将返回IEnumerable而不是将其转换为列表,那么它将在第一次使用时由调用者枚举

因此,如果您在_Db.logs中的数据大小很大,那么最好根据调用方的大小来枚举它,因为调用方不一定要枚举整个数据集(取决于调用方计划如何处理它)。

将IEnumerable转换为List会剥夺IEnumeraable的所有好处,主要是惰性评估。因此,如果您的调用者真的想创建一个List,请让他创建,但不要强迫他创建。

如果您想让人们选择何时评估查询,请返回IEnumerable。如果将IList指定为返回类型,则必须通过调用ToArray()或ToList()来计算表达式。

我建议使用这种方法。你应该通过你想要的,不会失去对数据采集时间的控制。

public List<LogEntry> GetLogs(Expression<Predicate<LogEntry>> where)
{
    return _Db.Logs.Where(where).ToList();
}

}