Tho*_*mas 3 c# linq debugging linq-to-objects
我是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));
Run Code Online (Sandbox Code Playgroud)
如何详细调试上面的linq查询.请指导我.谢谢.
为了回应这个看似简单的问题,可以写出很多内容!事实上,我已经在我的文章LINQ Secrets Revealed: Simple-Talk.com上的链接和调试中详细写了.以下是其要点摘要:
IEnumerable<T>输入并IEnumerable<T>作为输出返回..Select(z => z)一个没有后果的方法链,使用它的变体,即:z => { return z; }.Dump()方法为幌子提供了这一功能.转储是一个对象可视化工具,可以提供复杂数据结构的惊人可视化.Dump回到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);
Run Code Online (Sandbox Code Playgroud)
一旦在Visual Studio项目中包含Dump扩展方法,就可以像这样最小化它...
Words
.Select(word => word.Trim())
.Dump()
.Select(word => word.ToLower())
.Dump()
.Where(word => word.StartsWith("k"))
.Dump()
.OrderBy(word => word)
.Dump();
Run Code Online (Sandbox Code Playgroud)
......或者更精心地像这样......
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);
Run Code Online (Sandbox Code Playgroud)
...将输出分别呈现为图的左侧或右侧:

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