我正在使用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
。那么为什么这不起作用呢?
答案 0 :(得分:6)
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());
}
您也可以使用OfType<T>
代替Cast<T>
。但是,如果序列中存在WorkItem
以外的其他内容(在此方案中可能永远不会出现这种情况),Cast<T>
会抛出InvalidCastException
而OfType<T>
会忽略该Matlab
元件。
答案 1 :(得分:5)
WorkItemCollection
实施IEnumerable
,而非IEnumerable<T>
。它是后者,通用的接口,是LINQ的基础。
您可以使用Cast<T>
扩展方法从一个转换为另一个,但是:
workItemList.Cast<WorkItem>.Select(item => ...