zoukankan      html  css  js  c++  java
  • 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。这将仅显示与日志名称前缀匹配的行。

  • 相关阅读:
    IOS 获取时间的问题
    JQ 点赞
    截取字符串第一个空格前的字符
    JQ 的一些方法
    匿名函数var a =function(){}和function a(){}的区别
    完美支持中文编程的 Emacs 配置文件 .emacs
    linux find 命令忽略某个或多个子目录的方法
    Linux下如何用date设置时间
    nagios的监控代码!
    shell脚本监控apache进程数和oracle连接数
  • 原文地址:https://www.cnblogs.com/missile/p/11095341.html
Copyright © 2011-2022 走看看