• 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。这将仅显示与日志名称前缀匹配的行。

  • 相关阅读:
    C# private public protected internal
    VS2008 的计算代码度量值
    vs2008安装失败
    DataGridView 结束编辑不用鼠标点其它地方
    常见的C #单元测试工具介绍
    只运行一个实例的写法
    C# WebBrowser控件禁用超链接转向、脚本错误提示、默认右键菜单和快捷键
    C#中的深复制和浅复制
    Prototype源码浅析——String部分(二)
    从URL中提取参数与将对象转换为URL查询参数
  • 原文地址:https://www.cnblogs.com/missile/p/11095341.html
Copyright © 2020-2023  润新知