2016-03-22 15 views
2

Ich habe den folgenden Code:IEnumerable <object> zur Liste <object>

public IList<MyObject> GetSomeData(string inputParam) 
{ 
    var temp = repository.GetData(inputParam); 
    var list = temp as List<MyObject>; 
    return list; 
} 

Der Rückgabewert von repository.GetData ist IEnumerable<IMyObject>

Als ich im Wert von Temp aussehen, hat es mehr als 400 Datensätze. In dem Moment, in dem ich es in die Liste gebe, wird es null. Warum ist diese Besetzung nicht möglich?

+6

'var list = temp.ToList();' –

+4

Weil Ihre 'IEnumerable 'ist keine' Liste'. 'IEnumerable' s kommen in vielen Formen und Größen, und viele von ihnen sind nicht 'List's. Verwenden Sie stattdessen '.ToList()'. –

+0

Verwenden Sie '' '' nicht zum Eingeben von C#. Verwenden Sie '(Liste ) temp', es sei denn, Sie möchten, dass' list' 'null' ist, wenn' temp' keine 'list ' ist. –

Antwort

2

Wenn das zugrunde liegende Objekt des von repository.GetData zurückgegebenen Werts nicht mit dem übereinstimmt, zu dem Sie es zu konvertieren versuchen, ist das Ergebnis immer null. Da die generischen Elementtypen des Verfahrens und was zurückgeben tatsächlich von repository.GetData unterschiedlich sind, müssen Sie einige Umwandlungen tun, um das gewünschte Ergebnis

bekommen Unter der Annahme, dass MyObject implementiert IMyObject kann ich zumindest Möglichkeiten denken mit System.Linq zu bekommen das Ergebnis, das du suchst.

Option 1: Cast<T>()

Casts die Elemente eines System.Collections.IEnumerable in den angegebenen Typ.

zuerst den Inhalt von temp mit der Cast<MyObject>() Linq Erweiterung konvertieren und dann die ToList<T>() Extension-Methode verwenden, um Sie IList<MyObject>

public IList<MyObject> GetSomeData(string inputParam) 
{ 
    //repository.GetData returns IEnumerable<IMyObject> 
    var temp = repository.GetData(inputParam); 
    var list = temp.Cast<MyObject>().ToList(); 
    return list; 
} 

Option 2 zu erhalten resultierende: Die Filter OfType<T>()

Elemente eines System.Collections.IEnumerable basierend auf einem angegebenen Typ.

Filter der Gehalt an temp mit der OfType<MyObject>() Linq Erweiterung und verwenden Sie dann die ToList<MyObject>() Erweiterung Methode, die Sie bekommen resultierende IList<MyObject>

public IList<MyObject> GetSomeData(string inputParam) 
{ 
    //repository.GetData returns IEnumerable<IMyObject> 
    var temp = repository.GetData(inputParam); 
    var list = temp.OfType<MyObject>().ToList(); 
    return list; 
} 
+0

IEnumerable implementiert bereits ToList(). Es wird den generischen Typ als eine Liste von T ableiten, so dass dies nicht erforderlich ist, es sei denn, MyObject wird von der generischen Klasse geerbt. – Octanic

+0

@Octanic IEnumerable implementiert nicht ToList(). https://msdn.microsoft.com/en-us/library/system.collections.ienumerable%28v=vs.110%29.aspx – Nkosi

+0

In der Tat, ich sollte es als IEnumerable verweisen ... Überprüfen Sie dies: https://msdn.microsoft.com/en-us/library/9eekhta0(v=vs.110).aspx @Nkosi – Octanic

4

Es gibt null zurück, weil IEnumerable keine Liste ist. Die Umwandlung wird nur gelingen, wenn dies insbesondere IEnumerable statt einer anderen Art von Sequenz eine List ist. Wenn Sie eine Liste haben möchten, müssen Sie eine neue Liste erstellen und die Elemente aus der Sequenz in diese Liste einfügen.

+0

das Problem, wenn ich .ToList tun, ist es, dass 'Liste 'als Rückgabetyp wanst und ich das Objekt serialisieren muss. Ich kann das Objekt nicht serialisieren, wenn ich es so zurückgebe. – Bojan

+2

@Bagzli Verwenden Sie dann einfach den Konstruktor 'List'. – Servy

Verwandte Themen