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>.

Pankaj
quelle
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>;
Pbirkoff
quelle
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();
Mark Seemann
quelle
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();
bläulich
quelle
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).

Webleeuw
quelle
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.

Hudhaifa Yoosuf
quelle
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);
    }
}
user11331434
quelle
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.

Jason Landbridge
quelle
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>();
    }
Goldener Löwe
quelle
-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();
Ghebrehiywet
quelle
valueList muss eine Liste des Objekts sein