48 votes

Comment convertir une IList non générique en IList<T> ?

J'ai une classe qui veut un IList<T> mais j'ai un Systems.Collection.IList provenant d'une requête NHibernate.

Je veux créer une méthode qui le convertit en un fichier de type IList<T> . Comment dois-je m'y prendre ?

84voto

Tamas Czinege Points 49277

Si vous êtes sûr que tous les éléments héritent de T (ou de n'importe quel type que vous utilisez)

IList<T> myList = nonGenericList.Cast<T>().ToList();

Si vous n'êtes pas sûr :

IList<T> myList = nonGenericList.OfType<T>().ToList();

Bien entendu, vous aurez besoin de l'espace de noms System.Linq :

using System.Linq;

6voto

Scott Wisniewski Points 14420

Cast et OfType retourner IEnumerable<T> les mises en œuvre, et non IList<T> implémentations, donc ils ne vous seraient pas utiles.

Appel . Cast<T>().ToList entraînera une copie supplémentaire de la liste, ce qui peut avoir des conséquences négatives sur les performances.

Une meilleure approche (IMHO) serait de créer une classe enveloppe et de faire la conversion à la volée. Vous voulez quelque chose comme ceci :

class ListWrapper<T> : IList<T>
{
    private IList m_wrapped;

    //implement all the IList<T> methods ontop of m_wrapped, doing casts
    //or throwing not supported exceptions where appropriate.
    //You can implement 'GetEnumerator()' using iterators. See the docs for 
    //yield return for details
}

Cela aura l'avantage de ne pas créer une autre copie de la liste entière.

4voto

Ram Karri Points 21

Fredrick a raison. Mais Nhibernate a aussi une option pour retourner plusieurs ensembles de résultats. Par exemple :

  IList multiResults = session.CreateMultiCriteria()
                .Add(pageCriteria)
                .Add(countCriteria)
                .List();

Dans l'appel ci-dessus, il n'y a pas d'option pour retourner une liste tapée. Donc, il doit être casté comme mentionné ci-dessus, comme ceci :

 IList<T> results = ((IList)multiResults[0]).Cast<T>().ToList();
            IList counts = (IList)multiResults[1];

1voto

Frederik Gheysels Points 36354

Ne pouvez-vous pas faire en sorte que NHibernate vous renvoie une IList ? L'interface ICriteria définit un List<T> méthode ...

1voto

mako Points 38

Frederik a raison, NHibernate le fait déjà.

var data = query.List<MyType>();

Il en résulterait une IList du type que vous avez spécifié. Dans ce cas IList<MyType> .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X