以LINQ方式返回最大数量的项目

Eri*_*ohl 4 c# linq

假设我有一个带有底层数据存储库的搜索模块,并且要求从搜索查询中返回最多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)

然而,这似乎有点笨拙而不必要.

Ser*_*rvy 9

你的方法是最好的方法.我根本不会做任何改变.

任何其他选项,例如首先单独查询计数,如果您的项目少于26项,则执行看似昂贵的操作(进行实际搜索)两次.在错误情况下只保留一点点,并在常见情况下增加了大量费用.

唯一一次你的代码不太理想的情况是,如果_repository.Search(name)返回一个可以廉价迭代两次的类型,并且可以便宜地提供它的计数(例如,a List),但在上下文中似乎不是这种情况.