【问题标题】:C# LINQ Debugging through an IEnumerable extension method通过 IEnumerable 扩展方法进行 C# LINQ 调试
【发布时间】:2012-10-30 13:20:44
【问题描述】:

我正在尝试逐步执行以下我称为 DumpIt 的 IEnumerable 扩展方法。调试器不会单步执行它。如何让调试器单步执行此扩展方法?

我的单元测试:

[Test]
        public void TestDumpIt()
        {
            var words =
                new string[] {"   KOOKABURRA", "Frogmouth", "kingfisher   ", "loon", "merganser"};

            var result = words
                .DumpIt(d => "original: " + d)
                .Select(word => word.Trim())
                .DumpIt(d => "trimmed: " + d)
                .Select(word => word.ToLower())
                .DumpIt(d => "lower cased: " + d)
                .Where(word => word.StartsWith("k"))
                .DumpIt(d => "starts with k: " + d)
                .OrderBy(word => word)
                .DumpIt(d => "orderd: " + d);
        }

扩展方法:

public static IEnumerable<T> DumpIt<T>(this IEnumerable<T> input,
    Func<T, string> toString
    )
{
    foreach (var item in input)
    {
        Output.ActivePane.Activate();
        Output.ActivePane.OutputString(
            ShowWhiteSpace ? '[' + toString(item) + ']' : toString(item));

        yield return item;
    }
}

感谢您的帮助!

【问题讨论】:

  • 调试器不会在扩展方法体本身的断点处停止?
  • 从 make clean 开始,然后重新构建整个东西。有时,其中一个调试文件没有得到更新、损坏、不同步等,而程序可以正常工作,只是无法正确调试。边注;只在每个项目上调用一次选择器函数被认为是一种很好的做法。在这里很容易做到;只需将结果保存到一个变量并打印两次,而不是计算两次。
  • 我看到您在 LINQ 调试中使用我的 old article 中的代码。我刚刚为那篇文章写了续集——6 年后(!)——在简洁的 Visual Studio 扩展的帮助下将调试 LINQ 提升到了一个新的水平——见LINQ Debugging and Visualization

标签: c# linq debugging


【解决方案1】:

当使用yield 时,您正在使用延迟执行。您正在使用的其他 LINQ 方法也使用延迟执行。在您开始在TestDumpIt 中枚举result 之前,实际上不会调用DumpIt 方法。如果你想看到代码被调用,你需要枚举可枚举的。例如,您可以在末尾添加一个result.ToList() 来强制枚举。

【讨论】:

  • 呃,我的部分!谢谢马特 - 解决了它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多