如果我尝试在IEnumerable对象图的多个级别上过滤结果,那么链接扩展方法的首选方式是什么?
我可以使用任何扩展方法和Lambda表达式,但是我希望不使用LINQ语法,以保持与代码库的一致性。
将筛选推送到SelectMany()方法的选择器还是只链接另一个Where()方法更好?还是有更好的解决方案?
如何确定最佳选项?在这个测试用例中,所有内容都直接可用于内存。显然,下面的两个样本目前都产生了相同的正确结果;我只是在寻找一个理由,为什么喜欢其中之一(或另一种选择)。
我可以使用任何扩展方法和Lambda表达式,但是我希望不使用LINQ语法,以保持与代码库的一致性。
将筛选推送到SelectMany()方法的选择器还是只链接另一个Where()方法更好?还是有更好的解决方案?
如何确定最佳选项?在这个测试用例中,所有内容都直接可用于内存。显然,下面的两个样本目前都产生了相同的正确结果;我只是在寻找一个理由,为什么喜欢其中之一(或另一种选择)。
public class Test
{
// I want the first chapter of a book that's exactly 42 pages, written by
// an author whose name is Adams, from a library in London.
public Chapter TestingIEnumerableTExtensionMethods()
{
List<Library> libraries = GetLibraries();
Chapter chapter = libraries
.Where(lib => lib.City == "London")
.SelectMany(lib => lib.Books)
.Where(b => b.Author == "Adams")
.SelectMany(b => b.Chapters)
.First(c => c.NumberOfPages == 42);
Chapter chapter2 = libraries
.Where(lib => lib.City == "London")
.SelectMany(lib => lib.Books.Where(b => b.Author == "Adams"))
.SelectMany(b => b.Chapters.Where(c => c.NumberOfPages == 42))
.First();
}
这里是样例对象图:
public class Library
{
public string Name { get; set; }
public string City { get; set; }
public List<Book> Books { get; set; }
}
public class Book
{
public string Name { get; set; }
public string Author { get; set; }
public List<Chapter> Chapters { get; set; }
}
public class Chapter
{
public string Name { get; set; }
public int NumberOfPages { get; set; }
}
1个库
,每个库有3本书
,每本书有5000章节
。下一次我可能有1个库
,每个库有5000本书
,每本书只有1章节
。因为我无法准确预测其中之一,所以测量并不理想,我希望得到一般性的指导,并让可读性成为更核心的目标。 - BQ.