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

  • 相关阅读:
    QButtonGroup按钮组
    命令链接按钮QCommandLinkButton
    Arduino-常用指令
    第十章第三节 物体的浮沉条件及应用
    安装包制作工具 SetupFactory使用1 详解
    ONVIF、RTSP/RTP、FFMPEG的开发实录
    ffmpeg摄像头采集h264编码RTP发送
    ffmpeg综合应用示例(一)——摄像头直播
    利用ffmpeg一步一步编程实现摄像头采集编码推流直播系统
    ffmpeg超详细综合教程——摄像头直播
  • 原文地址:https://www.cnblogs.com/missile/p/11095341.html
Copyright © 2020-2023  润新知