首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过接口搜索列表

通过接口搜索列表
EN

Stack Overflow用户
提问于 2014-02-18 17:28:53
回答 2查看 361关注 0票数 2

我有一个实现接口Bookstore的类IBookstore

Bookstore作为私有财产有一个图书列表:private List<Book> AllBooks;

我不想通过界面公开整个图书列表。相反,我希望用户根据某些属性查询书籍。因此,在IBookstore中,我有以下内容:

代码语言:javascript
复制
public interface IBookstore
{
    IList<Book> SelectedBooks;
}
public class Bookstore : IBookstore
{
    private List<Book> AllBooks;
    public IList<Book> SelectedBooks { get; set; }
}

我想要做的是在名为SearchBooks的方法中创建一个方法,它将搜索列表AllBooks中包含各种属性的所有条目,然后用结果设置SelectedBooks。因此,我的用法如下:

代码语言:javascript
复制
Bookstore myStore = new Bookstore();
...
myStore.SearchBooks( A BUNCH OF CRITERIA );
myStore.SelectedBooks; // contains books selected by the criteria passed to SearchBooks above

我为什么要这样做:

  • 我需要多次访问SelectedBooks。我不想搜索很多次。
  • 我希望SelectedBooks的列表是myBookstore的属性。这个对象只创建一次,并在许多地方使用,因此我希望能够在许多地方访问相同的SelectedBooks,而不必重新构造它。将其存储为本地属性是不可取的;也就是说,我不想执行List<Book> myBooks = myStore.SearchBooks( A BUNCH OF CRITERIA);。我有一个很好的理由。

我的问题

鉴于Book具有许多属性,例如TitleAuthorDate等,那么最简单的方法是将一组搜索条件任意传递给SearchBooks,这样我就可以在Bookstore中私下搜索列表了。

例如,如果我能够访问我的应用程序中的整个列表,我可以使用Linq。我可以将一个Linq查询传递给一个方法,并让查询在myBookstore内部私下执行吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-18 17:32:56

我是否可以将一个Linq查询传递给一个方法,并让查询在myBookstore中私下执行?

您可以通过委托:

代码语言:javascript
复制
public void SearchBooks(Func<IEnumerable<Book>, IEnumerable<Book>> query)
{
    SelectedBooks = query(AllBooks).ToList();
}

打电话给示例:

代码语言:javascript
复制
myStore.SearchBooks(c => c.Where(b => b.Title == "test" && b.Author == "author"));

或者仅仅是一组谓词:

代码语言:javascript
复制
public void SearchBooks(params Func<Book, bool>[] predicates)
{
    var query = AllBooks.AsEnumerable();
    foreach(var p in predicates)
        query = query.Where(p);

    SelectedBooks = query.ToList();
}

打电话给示例:

代码语言:javascript
复制
myStore.SearchBooks(x => x.Title == "test", x => x.Author == "author");
票数 4
EN

Stack Overflow用户

发布于 2014-02-18 17:37:25

我个人不会经历所有试图抽象查询概念的麻烦。相反,可以直接在图书列表上使用LINQ。

您可以将图书列表公开为可枚举的序列。

代码语言:javascript
复制
public interface IBookstore
{
    IEnumerable<Book> Books;
}

然后你可以通过LINQ以任何你喜欢的方式查询它。

代码语言:javascript
复制
IBookstore store;   // Some store.
var johngreenBooks = from book in store.Books
                     where book.Author == "John Green"
                     orderby book.Title
                     select book;

如果不希望每次枚举查询时计算查询,请将其作为列表或数组。

代码语言:javascript
复制
var johngreenBookArray = johngreenBooks.ToArray();

您可以传递这个数组(或列表),或者把它放在某个地方。在我看来,我用来选择某些书籍的查询是独立于书店的,所以我不会将结果存储在书店中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21861078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档