2016-07-20 5 views
2

Ich verwende die COM-Schnittstelle zu TFS. (TeamFoundationServer.ExtendedClient v14.95.3). Ich versuche LINQ zu verwenden, um über die verschiedenen Sammlungen zu iterieren. Zum Beispiel wird diese Funktion funktioniert super:Warum kann ich nicht LINQ mit WorkItemCollection verwenden

public static IEnumerable<string> GetTitles(WorkItemCollection workItemList) 
    { 
     return from WorkItem item in workItemList select item.Fields["Title"].Value.ToString(); 
    } 

aber wenn ich versuche, das Verfahren zu ändern, es Syntax nicht zu verwenden:

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

... gibt mir „Fehler 'WorkItemCollection' enthält keine Definition für 'Wählen' ... "

Ich habe using System.Linq; in meiner Datei. Und ich verweise auf System.Core.dll. Die WorkItemCollectiontut implementieren IEnumerable. Warum funktioniert das nicht?

Antwort

6

WorkItemCollection nur IEnumerable, nicht implementiert, aber nicht IEnumerable<WorkItem>: mit der Cast<T> Erweiterungsmethode jedoch

Sie können von einem zum anderen zu konvertieren. Die LINQ-Erweiterungen sind nur für IEnumerable<T> deklariert, nicht für das nicht-generische IEnumerable.

Was Sie tun können, ist OfType<T>() verwenden:

public static IEnumerable<string> GetTitles2(WorkItemCollection workItemList) 
{ 
    return workItemList.OfType<WorkItem>() 
         .Select(item => item.Fields["Title"].Value.ToString()); 
} 

Statt OfType<T> Sie auch Cast<T> verwenden können. Aber wenn es etwas anderes als ein WorkItem in der Sequenz gibt (was wahrscheinlich nie der Fall in diesem Szenario ist), würde Cast<T> einen InvalidCastException werfen, während OfType<T> dieses Element ignorieren würde.

5

WorkItemCollection implementiert IEnumerable, nicht IEnumerable<T>. Es ist die letztere, generische Schnittstelle, die die Grundlage von LINQ bildet.

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

Danke! funktioniert perfekt. Ich wünschte, ich könnte beide Antworten akzeptieren :) –

Verwandte Themen