J'ai défini ce qui suit:
public ICollection<Item> Items { get; set; }
Quand j'exécute ce code:
Items = _item.Get("001");
Je reçois le message suivant:
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?)
Quelqu'un peut-il expliquer ce que je fais mal. Je suis très confus quant à la différence entre Enumerable, Collections et en utilisant ToList ()
Informations ajoutées
Plus tard dans mon code, j'ai ce qui suit:
for (var index = 0; index < Items.Count(); index++)
Est-ce que je serais d'accord pour définir des éléments comme un IEnumerable?
public IEnumerable<Item> Items { get; set; }
Avez-vous une raison particulière de l'avoir commeICollection
?Réponses:
ICollection<T>
hérite deIEnumerable<T>
so pour attribuer le résultat deIEnumerable<T> Get(string pk)
à un
ICollection<T>
il y a deux façons.// 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 deuxième option est plus flexible, mais a un impact beaucoup plus important sur les performances. Une autre option consiste à stocker le résultat sous forme de,
IEnumerable<T>
sauf si vous avez besoin des fonctionnalités supplémentaires ajoutées par l'ICollection<T>
interface.Commentaire supplémentaire sur les performances
La boucle que vous avez
for (var index = 0; index < Items.Count(); index++)
fonctionne sur un
IEnumerable<T>
mais il est inefficace; chaque appel àCount()
nécessite une énumération complète de tous les éléments. Utilisez une collection et laCount
propriété (sans les parenthèses) ou convertissez-la en boucle foreach:foreach(var item in Items)
la source
ICollection<T>
peut être manipulé (voir le doc pour plus de détails), tandis qu'unIEnumerable<T>
ne peut être énuméré.IEnumerable<T>
doncIEnumerable<T>
suffit dans ce cas.Vous ne pouvez pas convertir directement de
IEnumerable<T>
àICollection<T>
. Vous pouvez utiliser laToList
méthode deIEnumerable<T>
pour le convertir enICollection<T>
someICollection = SomeIEnumerable.ToList();
la source
En attendant plus d'informations sur la question:
veuillez fournir plus d'informations sur le type d'article et la signature de Get
Deux choses que vous pouvez essayer sont:
Veuillez noter que le second entraînera un impact sur les performances de la copie de la baie. Si la signature (type de retour) de Get n'est pas une ICollection, la première ne fonctionnera pas, si elle n'est pas IEnumerable, la seconde ne fonctionnera pas.
Suite à votre clarification à la question et dans les commentaires, je déclarerais personnellement le type de retour de _item.Get ("001") à ICollection. Cela signifie que vous n'aurez pas à faire de casting ou de conversion (via ToList / ToArray) qui impliquerait une opération de création / copie inutile.
// 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++)
Meilleures salutations,
la source