我是LINQ的新手,我一直在互联网上浏览并整天浏览教程。我有一些我认为可行的代码,但它抱怨返回类型。这是我的代码:
// The orgs parameter is a list of all buildings in the entire organization
// I want to retrieve only the IDs of all buildings in a particular region
private IList<int> GetRegionBuildingIDs(int regionId, List<OrgModel> orgs)
{
var ids = from org in orgs
where org.regionId == regionId
select new { id = org.buildingId };
return (IList<int>)ids;
}
这将返回一个id列表,但它们是匿名类型,并且强制转换不起作用。我得到一个System.InvalidCastException。
我最接近回答我的问题仍然让我感到困惑。 It's here。 I tried to follow the answer but my select(org.buildingId) only offers .ToString
所以这是我最近的尝试,但它错了:
private IList<int> GetRegionBuildingIDs(int regionId, List<OrgModel> orgs)
{
IEnumerable<int> ids = from org in orgs
where org.regionId == regionId
select (org.buildingId)._________; // This should be .ToList
return (IList<int>)ids;
}
期待在这里获得一些帮助。谢谢。
答案 0 :(得分:6)
您不需要select new {}
,您可以直接select
:
var ids = from org in orgs
where org.regionId == regionId
select org.buildingId;
return ids.ToList();
这是因为select new {}
使用带有单个int
成员的匿名类型,而不是直接返回int
值。
您也无法将Linq查询转换为List<T>
,因为它们不是List<T>
的实例,而是其他内容(一个由{{1}构建的延迟评估的状态机C#语言功能)。
当然,您的代码可以更加简单
yield return
如果您愿意,请制作自己的扩展方法:
private static IEnumerable<Int32> GetRegionBuildingIds(Int32 regionId, IEnumerable<OrgModel> orgs) {
return orgs
.Where( org => org.regionId == regionId )
.Select( org => org.buildingId );
}
像这样使用:
public static IEnumerable<Int32> GetRegionBuildingIds(this IEnumerable<OrgModel> orgs, Int32 forRegionId) {
return orgs
.Where( org => org.regionId == regionId )
.Select( org => org.buildingId );
}
答案 1 :(得分:2)
就铸造而言。试试这个:
// The orgs parameter is a list of all buildings in the entire organization
// I want to retrieve only the IDs of all buildings in a particular region
private IList<int> GetRegionBuildingIDs(int regionId, List<OrgModel> orgs)
{
var ids = (from org in orgs
where org.regionId == regionId
select (int)org.buildingId).ToList();
return ids;
}
或者如果buildingId可以为空,你可以试试这个
select (int)(org.buildingId ?? 0)