He definido lo siguiente:
public ICollection<Item> Items { get; set; }
Cuando ejecuto este código:
Items = _item.Get("001");
Recibo el siguiente mensaje:
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?)
¿Alguien puede explicar qué estoy haciendo mal? Estoy muy confundido acerca de la diferencia entre Enumerable, Colecciones y el uso de ToList ()
Información agregada
Más adelante en mi código tengo lo siguiente:
for (var index = 0; index < Items.Count(); index++)
¿Estaría bien para definir Items como IEnumerable?
public IEnumerable<Item> Items { get; set; }
¿Tienes alguna razón especial para tenerlo asíICollection
?Respuestas:
ICollection<T>
hereda deIEnumerable<T>
so para asignar el resultado deIEnumerable<T> Get(string pk)
a un
ICollection<T>
hay dos formas.// 1. You know that the referenced object implements `ICollection<T>`, // so you can use a cast ICollection<T> c = (ICollection<T>)Get("pk"); // 2. The returned object can be any `IEnumerable<T>`, so you need to // enumerate it and put it into something implementing `ICollection<T>`. // The easiest is to use `ToList()`: ICollection<T> c = Get("pk").ToList();
La segunda opción es más flexible, pero tiene un impacto en el rendimiento mucho mayor. Otra opción es almacenar el resultado como un a
IEnumerable<T>
menos que necesite la funcionalidad adicional agregada por laICollection<T>
interfaz.Comentario de rendimiento adicional
El bucle que tienes
for (var index = 0; index < Items.Count(); index++)
funciona en un
IEnumerable<T>
pero es ineficiente; cada llamada aCount()
requiere una enumeración completa de todos los elementos. Utilice una colección y laCount
propiedad (sin paréntesis) o conviértala en un bucle foreach:foreach(var item in Items)
fuente
ICollection<T>
se puede manipular (consulte el documento para obtener más detalles), mientras que unIEnumerable<T>
solo se puede enumerar.IEnumerable<T>
así queIEnumerable<T>
es suficiente en ese caso.No puede convertir directamente de
IEnumerable<T>
aICollection<T>
. Puede usar elToList
método deIEnumerable<T>
para convertirlo aICollection<T>
someICollection = SomeIEnumerable.ToList();
fuente
Pendiente más información sobre la pregunta:
proporcione más información sobre el tipo de artículo y la firma de Get
Dos cosas que puedes probar son:
Tenga en cuenta que el segundo tendrá un impacto en el rendimiento de la copia de la matriz. Si la firma (tipo de retorno) de Get no es una ICollection, la primera no funcionará, si no es IEnumerable, la segunda no funcionará.
Después de su aclaración a la pregunta y en los comentarios, personalmente declararía el tipo de devolución de _item.Get ("001") a ICollection. Esto significa que no tendrá que realizar ninguna conversión o conversión (a través de ToList / ToArray), lo que implicaría una operación innecesaria de creación / copia.
// Leave this the same public ICollection<Item> Items { get; set; } // Change function signature here: // As you mention Item uses the same underlying type, just return an ICollection<T> public ICollection<Item> Get(string value); // Ideally here you want to call .Count on the collectoin, not .Count() on // IEnumerable, as this will result in a new Enumerator being created // per loop iteration for (var index = 0; index < Items.Count(); index++)
Atentamente,
fuente