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

Joh*_*kel 2 c# linq

我正在使用COM接口到TFS.(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();
    }
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试更改为使用方法语法时,它会失败:

    public static IEnumerable<string> GetTitles2(WorkItemCollection workItemList)
    {
        return workItemList.Select(item => item.Fields["Title"].Value.ToString());
    }
Run Code Online (Sandbox Code Playgroud)

...给我错误"'WorkItemCollection'不包含'Select'的定义......"

我有using System.Linq;我的档案.我正在引用System.Core.dll.在WorkItemCollection 没有实现IEnumerable.那么为什么这不起作用呢?

Ren*_*ogt 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());
}
Run Code Online (Sandbox Code Playgroud)

而不是OfType<T>你也可以使用Cast<T>.但是如果WorkItem序列中存在除了a之外的某些东西(在这种情况下可能永远不会出现这种情况),Cast<T>那么抛出一段InvalidCastException时间OfType<T>会忽略该元素.


Cha*_*ger 5

WorkItemCollection实现IEnumerable,而不是IEnumerable<T>.它是后者,通用的接口,是LINQ的基础.

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

workItemList.Cast<WorkItem>.Select(item => ...
Run Code Online (Sandbox Code Playgroud)