web-dev-qa-db-fra.com

Meilleure façon de convertir IList ou IEnumerable en tableau

J'ai une requête HQL pouvant générer une liste IList de résultats ou un IEnumerable de résultats.

Cependant, je veux qu'il renvoie un tableau de l'entité que je sélectionne, quel serait le meilleur moyen d'y parvenir? Je peux soit l'énumérer et construire le tableau, soit utiliser CopyTo () un tableau défini.

Y a-t-il une meilleure façon? Je suis allé avec l'approche CopyTo.

88
jishi

Quelle version de .NET utilisez-vous? S'il s'agit de .NET 3.5, j'appellerais simplement ToArray() et j'aurais terminé.

Si vous ne possédez qu'un IEnumerable non générique, procédez comme suit:

IEnumerable query = ...;
MyEntityType[] array = query.Cast<MyEntityType>().ToArray();

Si vous ne connaissez pas le type dans cette méthode mais que les appelants de la méthode le connaissent, rendez la méthode générique et essayez ceci:

public static void T[] PerformQuery<T>()
{
    IEnumerable query = ...;
    T[] array = query.Cast<T>().ToArray();
    return array;
}
151
Jon Skeet

Mettez ce qui suit dans votre fichier .cs:

using System.Linq;

Vous pourrez ensuite utiliser la méthode d'extension suivante à partir de System.Linq.Enumerable:

public static TSource[] ToArray<TSource>(this System.Collections.Generic.IEnumerable<TSource> source)

C'est à dire.

IEnumerable<object> query = ...;
object[] bob = query.ToArray();
44
Michael Joyce

J'ai envie de réinventer la roue ...

public static T[] ConvertToArray<T>(this IEnumerable<T> enumerable)
{
    if (enumerable == null)
        throw new ArgumentNullException("enumerable");

    return enumerable as T[] ?? enumerable.ToArray();
}
6
Philippe Matray

Si vous n'avez pas Linq, je l'ai résolu de la manière suivante:

    private T[] GetArray<T>(IList<T> iList) where T: new()
    {
        var result = new T[iList.Count];

        iList.CopyTo(result, 0);

        return result;
    }

J'espère que ça aide

2
Lug