我正在使用TFS的COM接口。(TeamFoundationServer.ExtendedClient v14.95.3)。我正在尝试使用LINQ来迭代各种集合。例如,此功能效果良好:
public static IEnumerable<string> GetTitles(WorkItemCollection workItemList)
{
return from WorkItem item in workItemList select item.Fields["Title"].Value.ToString();
}
然而,当我尝试更改为使用方法语法时,它失败了:
public static IEnumerable<string> GetTitles2(WorkItemCollection workItemList)
{
return workItemList.Select(item => item.Fields["Title"].Value.ToString());
}
出现错误"'WorkItemCollection'不包含'Select'的定义…"
我的文件中有using System.Linq;
。我指的是System.Core.dll
。WorkItemCollection
确实实现了IEnumerable
。那么,为什么这不起作用呢?
WorkItemCollection
仅实现IEnumerable
,而不实现IEnumerable<WorkItem>
。LINQ扩展仅为IEnumerable<T>
声明,而不为非通用IEnumerable
声明。
您可以使用OfType<T>()
:
public static IEnumerable<string> GetTitles2(WorkItemCollection workItemList)
{
return workItemList.OfType<WorkItem>()
.Select(item => item.Fields["Title"].Value.ToString());
}
您也可以使用Cast<T>
来代替OfType<T>
。但是,如果序列中有WorkItem
以外的东西(在这种情况下可能从来不是这样),Cast<T>
将抛出InvalidCastException
,而OfType<T>
将忽略该元素。
WorkItemCollection
实现IEnumerable
,而不是IEnumerable<T>
。后者是通用接口,是LINQ的基础。
您可以使用Cast<T>
扩展方法从一个转换到另一个,但是:
workItemList.Cast<WorkItem>.Select(item => ...