gpt4 book ai didi

c# - 如何调试 LINQ 结果

转载 作者:行者123 更新时间:2023-11-30 14:14:42 26 4
gpt4 key购买 nike

我是 linq 的新手。所以有时只是不明白 linq 是如何工作的。所以VS2010 IDE中有任何工具或内置机制可以详细调试linq执行。假设我有这个 linq 查询

var to_search = new[] { "Geo", "JCB" };

var result = from sr in list
let w = to_search.FirstOrDefault(ts => sr.Title.ToLower().Contains(ts.ToLower()))
where w != null
let a = new {sr=sr, word=w.ToLower()}
group a by a.word into g
orderby g.Count() descending
let sorted = g.OrderByDescending(a=> a.sr.Title.Select((c, i) => a.sr.Title.Substring(i)).Count(sub => sub.ToLower().StartsWith(a.word)))
from a in sorted
select a.sr;

var completeList = result.Concat(list.Except(result));

如何详细调试上面的 linq 查询。请指导我。谢谢。

最佳答案

可以写很多东西来回答这个看似简单的问题!事实上,我在我的文章中写得很详细LINQ Secrets Revealed: Chaining and Debugging在 Simple-Talk.com 上。以下是其要点的摘要:

  • 您可以使用调试器进入某些 LINQ 查询,但这取决于查询中表达式和语句的组成(因为您只能进入语句)。
  • LINQ 方法链之所以有效,是因为一个基本规则:每个非终端 方法都需要 IEnumerable<T>作为输入并返回 IEnumerable<T>作为输出。
  • 如果您愿意,您可以注入(inject)一个“无操作”语句来给您一个“垫脚石”,只要它符合该基本规则即可。也就是说,意识到你总是可以把 .Select(z => z)在没有后果的方法链中,使用它的变体,即:z => { return z; } .
  • 您可以类似地注入(inject)诊断方法来提供输出,而不仅仅是提供潜在的断点。 LINQPad ,出色的暂存器,不仅适用于 LINQ,而且通常适用于 C#,它以其强大的 Dump() 的形式提供了这一点。方法。 Dump 是一种对象可视化工具,可提供复杂数据结构的惊人可视化效果。
  • 基于 Bart De Smet 在其内容丰富的文章中所做的工作 LINQ to Objects – Debugging你可以带来Dump的简化 flavor 回到 Visual Studio——我提供了文章顶部提到的附加代码。
  • 感谢 Robert Ivanc 在 LINQPad Visualizer 上的工作您甚至可以将 LINQPad 可视化工具引入 Visual Studio(尽管您需要为单个表达式手动启动它;您不能将它连接到 Dump() 方法)。

作为一个简短的例子,考虑这个简单的方法链:

string[] Words = new string[]
{" KOOKABURRA", "Frogmouth", "kingfisher ", "loon", "merganser"};

Words
.Select(word => word.Trim())
.Select(word => word.ToLower())
.Where(word => word.StartsWith("k"))
.OrderBy(word => word);

在您的 Visual Studio 项目中包含 Dump 扩展方法后,您可以最低限度地像这样检测它...

Words
.Select(word => word.Trim())
.Dump()
.Select(word => word.ToLower())
.Dump()
.Where(word => word.StartsWith("k"))
.Dump()
.OrderBy(word => word)
.Dump();

...或更详细地像这样...

Words
.Dump(w => "ORIGINAL: " + w, ConsoleColor.Yellow)
.Select(word => word.Trim())
.Dump(w => "TRIMMED: " + w, ConsoleColor.Yellow)
.Select(word => word.ToLower())
.Dump(w => "LOWERCASE: " + w, ConsoleColor.Green)
.Where(word => word.StartsWith("k"))
.Dump(w => "FILTERED to 'K': " + w, ConsoleColor.Red)
.OrderBy(word => word)
.Dump(w => "SORTED: " + w, ConsoleColor.Blue);

... 分别将输出呈现为图形的左侧或右侧: Diagnostic output from Dump method in Visual Studio

作为预告片,我会说虽然这确实很有用,但您确实必须看到 LINQPad 可以对相同输出执行的增强可视化(为方便起见,再次使用 here 链接)。

关于c# - 如何调试 LINQ 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11440911/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com