Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法单步进入或打断在Linq查询/表达式内部调用的方法_C#_Linq_Visual Studio 2013_Ienumerable_Pagedlist - Fatal编程技术网

C# 无法单步进入或打断在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

我在尝试进入从Linq查询中调用的方法时遇到了一个奇怪的问题(尽管我在使用Linq表达式时也遇到了这个问题)。代码可以编译,并且看起来很有效(我得到了我期望的结果)

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);
}