C# 无法单步进入或打断在Linq查询/表达式内部调用的方法
我在尝试进入从Linq查询中调用的方法时遇到了一个奇怪的问题(尽管我在使用Linq表达式时也遇到了这个问题)。代码可以编译,并且看起来很有效(我得到了我期望的结果)C# 无法单步进入或打断在Linq查询/表达式内部调用的方法,c#,linq,visual-studio-2013,ienumerable,pagedlist,C#,Linq,Visual Studio 2013,Ienumerable,Pagedlist,我在尝试进入从Linq查询中调用的方法时遇到了一个奇怪的问题(尽管我在使用Linq表达式时也遇到了这个问题)。代码可以编译,并且看起来很有效(我得到了我期望的结果) IEnumerable theOutcome=来自结果集中的r 选择GetTableDataRow(空); 或 IEnumerable theOutcome=resultSet.Select(r=>GetTableDataRow(null)); 正在调用的方法定义如下: private static TagBuilder Get
IEnumerable theOutcome=来自结果集中的r
选择GetTableDataRow(空);
或
IEnumerable theOutcome=resultSet.Select(r=>GetTableDataRow(null));
正在调用的方法定义如下:
private static TagBuilder GetTableDataRow(IEnumerable<object> rowData)
{
TagBuilder tr = new TagBuilder("tr");
return tr;
}
私有静态标记生成器GetTableDataRow(IEnumerable rowData)
{
标记生成器tr=新标记生成器(“tr”);
返回tr;
}
resultSet
变量是一个包含两项的IPagedList
变量theOutcome
最终按预期保存了两个TagBuilder
实例
但是,即使我在所讨论的Linq查询上或之前设置了断点,我也无法进入GetTableDataRow()
。如果我在GetTableDataRow()
方法中放置断点,它也不会命中该断点
我完全被难住了。有人能帮忙吗?代码现在显然非常简单,但在开发该方法时,我需要使用调试器逐步检查该方法的内容。您需要对表达式求值 只需调用
ToArray()
、ToList()
、Count()
,或IEnumerable
上强制求值的任何其他方法或扩展
使用计算Select
的结果,因此在使用查询之前,GetTableDataRow
不会发生任何变化
更明确地说,您可以通过扩展
Select
的功能来了解这一点:
IEnumerable<TagBuilder> theOutcome = resultSet.Select(r => GetTableDataRow(null));
因为
GetTableDataRow
返回的是yield
,所以在强制求值之前(例如通过ToArray()
等)不会对其求值。将.ToArray()
放在Select
的末尾,允许我进入该方法!我看了你链接的那篇文章,但我并不真正理解惰性计算与这个问题的关系,从某种意义上说,这不是正在计算的Linq,因为我正在将输出输入到输出变量中?看起来你现在已经把它删掉了,所以也许它根本不相关。我很想知道到底发生了什么。我把它删掉了,因为它不是一个相关的链接。。。我已经编辑了一个更好的链接的答案。当你说变量theOutcome最终像你的问题中所期望的那样包含两个TagBuilder实例时,调试器正在评估可枚举项。。。
private static TagBuilder GetTableDataRow(IEnumerable<object> rowData)
{
TagBuilder tr = new TagBuilder("tr");
return tr;
}
IEnumerable<TagBuilder> theOutcome = resultSet.Select(r => GetTableDataRow(null));
IEnumerable<TagBuilder> theOutcome = getRows(resultSet);
IEnumerable<TagBuilder> getRows(IEnumerable<IPagedList> source)
{
foreach ( IPagedListitem in source )
yield return GetTableDataRow(null);
}