c# - 链接 IEnumerable<T> 扩展方法的首选(性能和可读性)方式是什么?

标签 c# .net extension-methods ienumerable

如果我尝试在 IEnumerable<T> 的多个级别过滤结果对象图,是否有链接扩展方法的首选方法来执行此操作?

我对任何扩展方法和 lambda 用法持开放态度,但我不想使用 LINQ 语法以与代码库的其余部分保持一致。

将过滤推送到 selector 是否更好?的 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; }
}

最佳答案

哪个最有可能因您使用的 LINQ 实现而异。 LinqToSql 的行为与内存中过滤不同。子句的顺序应根据使用的数据影响性能,因为天真的实现将在序列中较早地过滤更多记录,这意味着后面方法的工作较少。

对于您的两个示例,我猜想性能差异可以忽略不计,并且会支持第一个,因为它允许独立于其他子句更轻松地修改每个子句。

至于确定最佳选择,这与其他任何事情都一样:衡量。

关于c# - 链接 IEnumerable<T> 扩展方法的首选(性能和可读性)方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10078989/

相关文章:

.net - Entity Framework 和应用程序架构(松耦合等)

c# - ef4 导致 Web 服务中的循环引用

C# Reindent 代码工具

c# - 在 3D Kinect 中识别手语

c# - 如何在自动更新期间将 .NET 应用程序固定到任务栏?

c# - 如何将 DateTimePicker 值设置为今天的日期+1

ios - Swift 扩展类型约束

c# - 带有扩展方法的 List<T> 的深拷贝

C# MVC 模型表达式到值

c# - 如何将绘制的矩形存储在数组中?