专栏首页小神仙Linq调试实时输出信息扩展方法(摘抄)

Linq调试实时输出信息扩展方法(摘抄)

原文在此

[译]如何在C#中调试LINQ查询

原linq语句:

var res = employees
.Where(e => e.Gender == "Male")
.Take(3)
.Where(e => e.Salary > avgSalary)
.OrderBy(e => e.Age);

扩展方法:

        public static IEnumerable<T> LogLINQ<T>(this IEnumerable<T> enumerable, string logName, Func<T, string> printMethod)
        {
#if DEBUG
            int count = 0;
            foreach (var item in enumerable)
            {
                if (printMethod != null)
                {
                    Debug.WriteLine($"{logName}|item {count} = {printMethod(item)}");
                }
                count++;
                yield return item;
            }
            Debug.WriteLine($"{logName}|count = {count}");
#else    
             return enumerable;
#endif
        }

使用方法

var res = employees
    .LogLINQ("source", e => e.Name)
    .Where(e => e.Gender == "Male")
    .LogLINQ("logWhere", e => e.Name)
    .Take(3)
    .LogLINQ("logTake", e => e.Name)
    .Where(e => e.Salary > avgSalary)
    .LogLINQ("logWhere2", e => e.Name)
    .OrderBy(e => e.Age);

说明和解释:

  • 在LINQ查询中的每个操作之后放置 LogLINQ方法。它可以选择打印通过此操作的所有项目和总数。
  • logName是每个输出的前缀,可以轻松查看编写它的查询步骤。我喜欢将其命名为之后操作相同的名称。
  • Fun<T,string>printMethod允许打印给定项目的任何内容。在上面的示例中,我选择使用 e=>e.Name打印员工的姓名,当为 null时,除总数外,不会打印任何内容。
  • 为了优化,此方法尽在调试模式下有效( #if DEBUG)。在发布模式下,它什么都不做。
  • 每个项目都按顺序打印,无需等待操作结束,这是因为LINQ的 lazy 特性。以下是查看单个操作结果的提示:将整个输出复制到 notepad++。然后使用Ctrl+Shift+F(Find)并查找日志前缀(例如 logWhere2)。在查找对话框,点击Find All in Current Document。这将仅显示与日志名称前缀匹配的行。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 我们是如何发现针对欧洲政府的攻击

    寻找新型以及危险的网络威胁是PT ESC安全中心的主要工作之一,2019年中旬,PT ESC的分析人员发现了一起针对克罗地亚政府的网络攻击。在这篇文章中,我们将...

    FB客服
  • 寻觅Azure上的Athena和BigQuery(一):落寞的ADLA

    AWS Athena和Google BigQuery都是亚马逊和谷歌各自云上的优秀产品,有着相当高的用户口碑。它们都属于无服务器交互式查询类型的服务,能够直接对...

    用户1564362
  • linux下搭建gtest和gmock测试框架

    Google mock(以下简称gmock)和Google Test(以下简称gtest)是google的开源项目,他能够在测试中起到“打桩”的作用。举个例子,...

    用户5521279
  • C#3.0新增功能09 LINQ 基础02 LINQ 查询简介

    查询 是一种从数据源检索数据的表达式。 查询通常用专门的查询语言来表示。 随着时间的推移,人们已经为各种数据源开发了不同的语言;例如,用于关系数据库的 SQL ...

    张传宁老师
  • C#3.0新增功能03 隐式类型本地变量

    从 Visual C# 3.0 开始,在方法范围内声明的变量可以具有隐式“类型”var。 隐式类型本地变量为强类型,就像用户已经自行声明该类型,但编译器决定类型...

    张传宁老师
  • C#2.0新增功能03 匿名方法

      在 2.0 之前的 C# 版本中,声明委托的唯一方式是使用命名方法。 C# 2.0 引入匿名方法,在 C# 3.0 及更高版本中,Lambda 表达式取代匿...

    张传宁老师
  • C#3.0新增功能01 自动实现的属性

    在 C# 3.0 及更高版本,当属性访问器中不需要任何其他逻辑时,自动实现的属性会使属性声明更加简洁。 它们还允许客户端代码创建对象。 当你声明以下示例中所示的...

    张传宁老师
  • C#3.0新增功能09 LINQ 基础01 语言集成查询

    语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称。 数据查询历来都表示为简单的字符串,没有编译时类型检查或 IntelliSens...

    张传宁老师
  • C#3.0新增功能08 Lambda 表达式

    Lambda 表达式是作为对象处理的代码块(表达式或语句块)。 它可作为参数传递给方法,也可通过方法调用返回。 Lambda 表达式广泛用于:

    张传宁老师
  • C#2.0新增功能06 协变和逆变

    在 C# 中,协变和逆变能够实现数组类型、委托类型和泛型类型参数的隐式引用转换。 协变保留分配兼容性,逆变则与之相反。

    张传宁老师

扫码关注云+社区

领取腾讯云代金券