Ich versuche, IList
Typ für List
Typ umzuwandeln, erhalte jedoch jedes Mal einen Fehler.
List<SubProduct> subProducts= Model.subproduct;
Model.subproduct
kehrt zurück IList<SubProduct>
.
Ich versuche, IList
Typ für List
Typ umzuwandeln, erhalte jedoch jedes Mal einen Fehler.
List<SubProduct> subProducts= Model.subproduct;
Model.subproduct
kehrt zurück IList<SubProduct>
.
IList
doesn't have stuff that List
has, for example AddRange
Antworten:
Try
List<SubProduct> subProducts = new List<SubProduct>(Model.subproduct);
or
List<SubProduct> subProducts = Model.subproducts as List<SubProduct>;
Model.subproducts
bereits 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 NullReferenceException
spä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>
?
Wie wäre es damit:
List<SubProduct> subProducts = Model.subproduct.ToList();
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)
.
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.
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);
}
}
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 Foo
eine IFoo
Schnittstelle vorhanden ist.
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>();
}
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();