首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linq调试实时输出信息扩展方法(摘抄)

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

作者头像
用户6362579
发布2019-09-29 17:58:18
7800
发布2019-09-29 17:58:18
举报
文章被收录于专栏:小神仙小神仙

原文在此

[译]如何在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。这将仅显示与日志名称前缀匹配的行。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-06-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • [译]如何在C#中调试LINQ查询
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档