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



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

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 => ...

相关内容

  • 没有找到相关文章

最新更新