假设我有一个带有底层数据存储库的搜索模块,并且要求从搜索查询中返回最多25个结果.我可以使用Take()操作强制执行此操作:
IEnumerable<Contact> Search(string name)
{
// validation/cleanup on name parameter
IEnumerable<Contact> matching = _repository.Search(name);
return matching.Take(25);
}
Run Code Online (Sandbox Code Playgroud)
接下来,假设如果返回的结果超过25个(即搜索参数太宽),我还有额外的要求抛出异常.使用LINQ有一种直接的方法吗?到目前为止,我最接近的是取一个多于最大数量并使用它:
IEnumerable<Contact> Search(string name)
{
// validation/cleanup on name parameter
var matching = _repository.Search(name);
var toReturn = matching.Take(26).ToList();
if (toReturn.Count() > 25)
{
throw new Exception("Too many results");
}
return toReturn;
}
Run Code Online (Sandbox Code Playgroud)
然而,这似乎有点笨拙而不必要.
你的方法是最好的方法.我根本不会做任何改变.
任何其他选项,例如首先单独查询计数,如果您的项目少于26项,则执行看似昂贵的操作(进行实际搜索)两次.在错误情况下只保留一点点,并在常见情况下增加了大量费用.
唯一一次你的代码不太理想的情况是,如果_repository.Search(name)返回一个可以廉价迭代两次的类型,并且可以便宜地提供它的计数(例如,a List),但在上下文中似乎不是这种情况.