我有一个实现接口Bookstore的类IBookstore。
Bookstore作为私有财产有一个图书列表:private List<Book> AllBooks;
我不想通过界面公开整个图书列表。相反,我希望用户根据某些属性查询书籍。因此,在IBookstore中,我有以下内容:
public interface IBookstore
{
IList<Book> SelectedBooks;
}
public class Bookstore : IBookstore
{
private List<Book> AllBooks;
public IList<Book> SelectedBooks { get; set; }
}我想要做的是在名为SearchBooks的方法中创建一个方法,它将搜索列表AllBooks中包含各种属性的所有条目,然后用结果设置SelectedBooks。因此,我的用法如下:
Bookstore myStore = new Bookstore();
...
myStore.SearchBooks( A BUNCH OF CRITERIA );
myStore.SelectedBooks; // contains books selected by the criteria passed to SearchBooks above我为什么要这样做:
SelectedBooks。我不想搜索很多次。myBookstore的属性。这个对象只创建一次,并在许多地方使用,因此我希望能够在许多地方访问相同的SelectedBooks,而不必重新构造它。将其存储为本地属性是不可取的;也就是说,我不想执行List<Book> myBooks = myStore.SearchBooks( A BUNCH OF CRITERIA);。我有一个很好的理由。我的问题
鉴于Book具有许多属性,例如Title、Author、Date等,那么最简单的方法是将一组搜索条件任意传递给SearchBooks,这样我就可以在Bookstore中私下搜索列表了。
例如,如果我能够访问我的应用程序中的整个列表,我可以使用Linq。我可以将一个Linq查询传递给一个方法,并让查询在myBookstore内部私下执行吗?
发布于 2014-02-18 17:32:56
我是否可以将一个Linq查询传递给一个方法,并让查询在myBookstore中私下执行?
您可以通过委托:
public void SearchBooks(Func<IEnumerable<Book>, IEnumerable<Book>> query)
{
SelectedBooks = query(AllBooks).ToList();
}打电话给示例:
myStore.SearchBooks(c => c.Where(b => b.Title == "test" && b.Author == "author"));或者仅仅是一组谓词:
public void SearchBooks(params Func<Book, bool>[] predicates)
{
var query = AllBooks.AsEnumerable();
foreach(var p in predicates)
query = query.Where(p);
SelectedBooks = query.ToList();
}打电话给示例:
myStore.SearchBooks(x => x.Title == "test", x => x.Author == "author");发布于 2014-02-18 17:37:25
我个人不会经历所有试图抽象查询概念的麻烦。相反,可以直接在图书列表上使用LINQ。
您可以将图书列表公开为可枚举的序列。
public interface IBookstore
{
IEnumerable<Book> Books;
}然后你可以通过LINQ以任何你喜欢的方式查询它。
IBookstore store; // Some store.
var johngreenBooks = from book in store.Books
where book.Author == "John Green"
orderby book.Title
select book;如果不希望每次枚举查询时计算查询,请将其作为列表或数组。
var johngreenBookArray = johngreenBooks.ToArray();您可以传递这个数组(或列表),或者把它放在某个地方。在我看来,我用来选择某些书籍的查询是独立于书店的,所以我不会将结果存储在书店中。
https://stackoverflow.com/questions/21861078
复制相似问题