2010-02-26 12 views
6

Ich habe eine LINQ-Anweisung, die einen anonymen Typ zurückgibt. Ich muss diesen Typ in meiner Silverlight-Anwendung als ObservableCollection verwenden. Allerdings kann ich es am nächsten zu einemC# - anonymen Typ in observablecollection konvertieren

Liste myObjects;

Kann mir jemand sagen, wie das geht?

ObservableCollection<MyTasks> visibleTasks = e.Result; 
var filteredResults = from visibleTask in visibleTasks 
         select visibleTask; 

filteredResults = filteredResults.Where(p => p.DueDate == DateTime.Today); 
visibleTasks = filteredResults.ToList(); // This throws a compile time error 

Wie kann ich von einem anonymen Typ zu einer beobachtbaren Sammlung gehen?

Danke

Antwort

6

Als Ekin schlägt vor, Sie können eine generische Methode schreiben, die alle IEnumerable<T> in eine ObservableCollection<T> verwandelt. Dies hat einen wesentlichen Vorteil gegenüber dem Erstellen einer neuen Instanz von ObservableCollection mit Konstruktor - der C# -Compiler kann automatisch den generischen Typparameter beim Aufruf einer Methode ableiten, so dass Sie den Typ der Elemente nicht schreiben müssen. Auf diese Weise können Sie eine Sammlung anonymer Typen erstellen, die andernfalls nicht möglich wären (z. B. bei Verwendung eines Konstruktors).

Eine Verbesserung gegenüber der Ekin-Version besteht darin, die Methode als eine Erweiterungsmethode zu schreiben. Nach dem üblichen Namensmuster (wie ToList oder ToArray), können wir es ToObservableCollection nennen:

static ObservableCollection<T> ToObservableCollection<T> 
    (this IEnumerable<T> en) { 
    return new ObservableCollection<T>(en); 
} 

Jetzt können Sie eine beobachtbare Sammlung erstellen enthält anonyme Typen aus einer LINQ-Abfrage wie folgt zurückgegeben:

var oc = 
    (from t in visibleTasks 
    where t.IsSomething == true 
    select new { Name = t.TaskName, Whatever = t.Foo } 
).ToObservableCollection(); 
+0

Gibt es einen Weg, es ohne Generika zu tun? Ich meine, mit Inline-Code und ohne einen echten Typ zu erstellen. So etwas wie ObservableCollection ? – v1n1akabozo

0

Sind Sie sicher, dass , dass Ihr Objekt in der Tat ein ObservableCollection ist? Wenn ja, können Sie einfach werfen: visibleTasks = (ObservableCollection)filteredResults;

1

Sie sollten nur in der Lage sein, dies zu tun:

visibleTasks = new ObservableCollection<MyTasks>(filteredResults); 
2

So etwas würde den Job mit Typinferenz Funktionen tun:

private static ObservableCollection<T> CreateObservable<T>(IEnumerable<T> enumerable) 
{ 
    return new ObservableCollection<T>(enumerable); 
} 

static void Main(string[] args) 
{ 

    var oc = CreateObservable(args.Where(s => s.Length == 5)); 
} 
0

Versuchen:

var filteredResults = from visibleTask in visibleTasks 
         where(p => p.DueDate == DateTime.Today) 
         select visibleTask).ToList(); 

(filteredResults Ihre gewünschte Liste enthalten)

Verwandte Themen