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>;
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>?
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).
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>();
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()>
PublicSub AddRange(Of T)(ByRef Exttype As IList(Of T), ElementsToAdd As IEnumerable(Of T))
ForEach ele In ElementsToAdd
Exttype.Add(ele)
NextEndSub
Und in C #:
publicvoidAddRange<T>(thisref IList<T> Exttype, IEnumerable<T> ElementsToAdd)
{
foreach (var ele in ElementsToAdd)
{
Exttype.Add(ele);
}
}
IList
doesn't have stuff thatList
has, for exampleAddRange
Antworten:
Try
List<SubProduct> subProducts = new List<SubProduct>(Model.subproduct);
or
List<SubProduct> subProducts = Model.subproducts as List<SubProduct>;
quelle
Model.subproducts
bereitsList<SubProduct>
unter der Decke vom Typ ist . Wenn es sich um eine andere Implementierung von handeltIList<SubProduct>
, z. B.ReadOnlyCollection<SubProduct>
, wird stillschweigend null zurückgegeben undNullReferenceException
später in der Programmausführung wahrscheinlich sehr verwirrend . Und wirklich, wenn wir wissen, dass es immer ein sein wirdList<T>
, was bringt es dann überhaupt, einen zurückzugebenIList<T>
?Wie wäre es damit:
quelle
In meinem Fall musste ich dies tun, da keine der vorgeschlagenen Lösungen verfügbar war:
quelle
Die implizite Konvertierung schlägt fehl, weil
List<>
implementiert wirdIList
, nicht umgekehrt. Man kann also sagenIList<T> foo = new List<T>()
, aber nichtList<T> foo = (some IList-returning method or property)
.quelle
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.
quelle
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); } }
quelle
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
eineIFoo
Schnittstelle vorhanden ist.quelle
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>(); }
quelle
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();
quelle