【发布时间】:2009-02-27 20:14:50
【问题描述】:
如何为匿名对象指定 Func 签名?
new Func<DataSet, **IEnumerable<int>>**
我在 Func 声明中指定为 IEnumerable 的返回类型有问题
我从表达式中得到的错误是
无法将表达式类型“System.Collections.Generic.IEnumerable”转换为返回类型“System.Collections.Generic.IEnumerable”
如何在 func 中指定 IEnumerable?
public int GetCachedRootNodeId(IList<int> fromNodeIds, int forNodeId)
{
var result = forNodeId;
const string spName = "spFetchAllParentNodeIDs";
using (var ds = _df.ExecuteDatasetParamArray(_ConnectionString, spName, forNodeId))
{
if (DataAccessUtil.DataSetIsEmpty(ds)) return result;
var orderByLevelDesc = new Func<DataSet, IEnumerable<int>>(resultSet =>
from DataRow row in DataAccessUtil.GetFirstTableRows(resultSet)
orderby DataAccessUtil.GetInt32(row, "Level") descending
select new { ParentNodeId = DataAccessUtil.GetInt32(row, "ParentNodeID") });
//// Get top-most parent's node ID first (higher the level, the more top-most the parent is)
//var query = from DataRow row in DataAccessUtil.GetFirstTableRows(ds)
// orderby DataAccessUtil.GetInt32(row, "Level") descending
// select new { ParentNodeId = DataAccessUtil.GetInt32(row, "ParentNodeID") };
//foreach (var nodeInfo in query)
foreach (var nodeInfo in orderByLevelDesc(ds))
{
if (fromNodeIds.Contains(nodeInfo.ParentNodeId))
return nodeInfo.ParentNodeId;
}
}
return result;
}
顺便说一句,我可以使用注释代码“查询”并完成它。 但是想要更有表现力并在看到这个答案后尝试一些新的东西 Why doesn't C# have lexically nested functions?
编辑:最终结果
public int GetCachedRootNodeId(IList<int> fromNodeIds, int forNodeId)
{
var result = forNodeId;
const string spName = "spFetchAllParentNodeIDs";
using (var ds = _df.ExecuteDatasetParamArray(_ConnectionString, spName, forNodeId))
{
if (DataAccessUtil.DataSetIsEmpty(ds)) return result;
var orderParentNodeIDByLevelDesc = new Func<DataSet, IEnumerable<int>>(resultSet =>
from DataRow row in DataAccessUtil.GetFirstTableRows(resultSet)
orderby DataAccessUtil.GetInt32(row, "Level") descending
select DataAccessUtil.GetInt32(row, "ParentNodeID"));
foreach (var parentNodeId in orderParentNodeIDByLevelDesc(ds))
{
if (fromNodeIds.Contains(parentNodeId))
return parentNodeId;
}
}
return result;
}
【问题讨论】:
标签: c# linq anonymous-types