Int*_*ble 2 c# linq ienumerable pagedlist visual-studio-2013
我遇到了一个奇怪的问题,试图进入一个从Linq查询中调用的方法(虽然我在使用Linq表达式时也遇到了问题).代码编译,它似乎工作(我得到了我期待的结果).
IEnumerable<TagBuilder> theOutcome = from r in resultSet
select GetTableDataRow(null);
Run Code Online (Sandbox Code Playgroud)
要么
IEnumerable<TagBuilder> theOutcome = resultSet.Select(r => GetTableDataRow(null));
Run Code Online (Sandbox Code Playgroud)
被调用的方法定义如下:
private static TagBuilder GetTableDataRow(IEnumerable<object> rowData)
{
TagBuilder tr = new TagBuilder("tr");
return tr;
}
Run Code Online (Sandbox Code Playgroud)
该resultSet变量IPagedList包含两个项目.
该变量theOutcome最终TagBuilder按预期保存两个实例.
但是,GetTableDataRow()即使我在有问题的Linq查询之前或之前设置断点,我也不能介入.如果我在GetTableDataRow()方法中放置一个断点,那么它也不会出现这种情况.
我完全难过了.有人可以帮忙吗?Code现在显然非常简单,但是我需要在开发它时用调试器逐步完成该方法的内容.
您需要评估表达式.
只需致电ToArray(),ToList(),Count(),或任何其他方法或扩展上IEnumerable<T>,迫使评价.
Select使用延迟执行来评估结果,因此GetTableDataRow在使用查询之前不会发生任何事情.
更明确地说,您可以通过展开以下内容来看到这Select一点:
IEnumerable<TagBuilder> theOutcome = resultSet.Select(r => GetTableDataRow(null));
Run Code Online (Sandbox Code Playgroud)
相当于
IEnumerable<TagBuilder> theOutcome = getRows(resultSet);
Run Code Online (Sandbox Code Playgroud)
在哪里getRows:
IEnumerable<TagBuilder> getRows(IEnumerable<IPagedList> source)
{
foreach ( IPagedListitem in source )
yield return GetTableDataRow(null);
}
Run Code Online (Sandbox Code Playgroud)
因为GetTableDataRow被yield退回,它没有计算,直到评估被强制(例如,通过ToArray()等).
| 归档时间: |
|
| 查看次数: |
902 次 |
| 最近记录: |