Ich habe folgendes definiert:
public ICollection<Item> Items { get; set; }
Wenn ich diesen Code ausführe:
Items = _item.Get("001");
Ich erhalte die folgende Nachricht:
Error 3
Cannot implicitly convert type
'System.Collections.Generic.IEnumerable<Storage.Models.Item>' to
'System.Collections.Generic.ICollection<Storage.Models.Item>'.
An explicit conversion exists (are you missing a cast?)
Kann jemand erklären, was ich falsch mache. Ich bin sehr verwirrt über den Unterschied zwischen Enumerable, Collections und der Verwendung der ToList ()
Informationen hinzugefügt
Später in meinem Code habe ich Folgendes:
for (var index = 0; index < Items.Count(); index++)
Wäre es in Ordnung, Elemente als IEnumerable zu definieren?
public IEnumerable<Item> Items { get; set; }
Haben Sie einen besonderen Grund, es als zu habenICollection
?Antworten:
ICollection<T>
erbt vonIEnumerable<T>
so, um das Ergebnis von zuzuweisenZu einem
ICollection<T>
gibt es zwei Möglichkeiten.Die zweite Option ist flexibler, hat jedoch einen viel größeren Einfluss auf die Leistung. Eine andere Möglichkeit besteht darin, das Ergebnis als zu speichern, es
IEnumerable<T>
sei denn, Sie benötigen die zusätzliche Funktionalität, die von derICollection<T>
Schnittstelle hinzugefügt wird .Zusätzlicher Leistungskommentar
Die Schleife, die Sie haben
arbeitet an einem,
IEnumerable<T>
aber es ist ineffizient; Jeder Aufruf vonCount()
erfordert eine vollständige Aufzählung aller Elemente. Verwenden Sie entweder eine Sammlung und dieCount
Eigenschaft (ohne die Klammer) oder konvertieren Sie sie in eine foreach-Schleife:quelle
ICollection<T>
kann manipuliert werden ( Details finden Sie im Dokument ), während einIEnumerable<T>
nur aufgezählt werden kann.IEnumerable<T>
soIEnumerable<T>
, dass es in diesem Fall ausreicht.Sie können nicht direkt von
IEnumerable<T>
nach konvertierenICollection<T>
. Sie können dieToList
Methode verwendenIEnumerable<T>
, um es zu konvertierenICollection<T>
someICollection = SomeIEnumerable.ToList();
quelle
Bis weitere Informationen zu der Frage vorliegen:
Bitte geben Sie weitere Informationen zur Art des Artikels und zur Unterschrift von Get an
Zwei Dinge, die Sie ausprobieren können, sind:
Bitte beachten Sie, dass die zweite einen Leistungseinbruch für die Array-Kopie zur Folge hat. Wenn die Signatur (Rückgabetyp) von Get keine ICollection ist, funktioniert die erste nicht. Wenn sie nicht IEnumerable ist, funktioniert die zweite nicht.
Nach Ihrer Klarstellung zur Frage und in Kommentaren würde ich persönlich den Rückgabetyp von _item.Get ("001") an ICollection deklarieren. Dies bedeutet, dass Sie kein Casting oder keine Konvertierung (über ToList / ToArray) durchführen müssen, die einen unnötigen Erstellungs- / Kopiervorgang erfordern würde.
Freundliche Grüße,
quelle