Cast IList to List


72

Ich versuche, IListTyp für ListTyp umzuwandeln, erhalte jedoch jedes Mal einen Fehler.

List<SubProduct> subProducts= Model.subproduct;

Model.subproductkehrt zurück IList<SubProduct>.


9
it's best to program against the interface (IList) instead of the implimentation (List). It's an unneeded cast to go to List. You now have to add error handling if on the off chance an implementation of IList, which is not a List, enteres that code path.
Brian Leahy

7
Yeah, but IList doesn't have stuff that List has, for example AddRange
Serj Sagan

Antworten:


132

Try

List<SubProduct> subProducts = new List<SubProduct>(Model.subproduct);

or

List<SubProduct> subProducts = Model.subproducts as List<SubProduct>;

5
This is the right answer, but is there a reason that you want to deal with a List instead of IList? Most of the times using IList is a better choice.
Keith Rousseau

3
IList<SubProduct> subProducts= Model.subproduct;
Brian Leahy

4
@KeithRousseau Ich bin auf das Problem gestoßen, als ich die AddRange () -Methode verwenden musste.
ScubaSteve

8
Die zweite Option ist nicht sicher, da davon ausgegangen wird, dass sie Model.subproductsbereits List<SubProduct>unter der Decke vom Typ ist . Wenn es sich um eine andere Implementierung von handelt IList<SubProduct>, z. B. ReadOnlyCollection<SubProduct>, wird stillschweigend null zurückgegeben und NullReferenceExceptionspäter in der Programmausführung wahrscheinlich sehr verwirrend . Und wirklich, wenn wir wissen, dass es immer ein sein wird List<T>, was bringt es dann überhaupt, einen zurückzugeben IList<T>?
Sstan

34

Wie wäre es damit:

List<SubProduct> subProducts = Model.subproduct.ToList();

13

In meinem Fall musste ich dies tun, da keine der vorgeschlagenen Lösungen verfügbar war:

List<SubProduct> subProducts = Model.subproduct.Cast<SubProduct>().ToList();

4
List<SubProduct> subProducts= (List<SubProduct>)Model.subproduct;

Die implizite Konvertierung schlägt fehl, weil List<>implementiert wird IList, nicht umgekehrt. Man kann also sagen IList<T> foo = new List<T>(), aber nicht List<T> foo = (some IList-returning method or property).


9
Just a minor nitpick: List<T> does not derive from IList, It implements IList. The word derive implies that there is an inheritance relationship between the two.
Chris Dunaway

0
List<ProjectResources> list = new List<ProjectResources>();        
IList<ProjectResources> obj = `Your Data Will Be Here`;
list = obj.ToList<ProjectResources>();

This Would Convert IList Object to List Object.


0

Die anderen Antworten empfehlen alle, AddRange mit einer IList zu verwenden.

Eine elegantere Lösung, die das Casting vermeidet, besteht darin, eine Erweiterung von IList zu implementieren, um die Aufgabe zu erledigen.

In VB.NET:

<Extension()>
Public Sub AddRange(Of T)(ByRef Exttype As IList(Of T), ElementsToAdd As IEnumerable(Of T))
   For Each ele In ElementsToAdd
      Exttype.Add(ele)
   Next
End Sub

Und in C #:

public void AddRange<T>(this ref IList<T> Exttype, IEnumerable<T> ElementsToAdd)
{
    foreach (var ele in ElementsToAdd)
    {
        Exttype.Add(ele);
    }
}

0

Wenn Sie eine IList mit Schnittstellen haben, können Sie diese folgendermaßen umwandeln:

Liste zu IList

List<Foo> Foos = new List<Foo>(); 
IList<IFoo> IFoos = Foos.ToList<IFoo>();

IList to List

IList<IFoo> IFoos = new List<IFoo>();
List<Foo> Foos = new List<Foo>(IFoos.Select(x => (Foo)x));

Dies setzt voraus, dass Fooeine IFooSchnittstelle vorhanden ist.


0
    public async Task<List<TimeAndAttendanceShift>> FindEntitiesByExpression(Expression<Func<TimeAndAttendanceShift, bool>> predicate)
    {
        IList<TimeAndAttendanceShift> result = await _dbContext.Set<TimeAndAttendanceShift>().Where(predicate).ToListAsync<TimeAndAttendanceShift>();

        return result.ToList<TimeAndAttendanceShift>();
    }

-3

Dies ist die beste Option, um eine Liste generischer Objekte in eine Liste von Zeichenfolgen umzuwandeln.

object valueList;
List<string> list = ((IList)valueList).Cast<object>().Select(o => o.ToString()).ToList();

valueList muss eine Liste des Objekts sein
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.