为什么我不能将LINQ与WorkItemCollection一起使用

时间:2016-07-20 14:28:08

标签: c# linq

我正在使用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.dllWorkItemCollection 实施IEnumerable。那么为什么这不起作用呢?

2 个答案:

答案 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>会抛出InvalidCastExceptionOfType<T>会忽略该Matlab元件。

答案 1 :(得分:5)

WorkItemCollection实施IEnumerable,而非IEnumerable<T>。它是后者,通用的接口,是LINQ的基础。

您可以使用Cast<T>扩展方法从一个转换为另一个,但是:

workItemList.Cast<WorkItem>.Select(item => ...