web-dev-qa-db-fra.com

C # Cast tableau entier?

Je vois ça Array.ConvertAll, mais elle nécessite un Converter comme argument. Je ne vois pas pourquoi j'ai besoin d'un convertisseur, alors que j'en ai déjà défini un implicite dans ma classe:

    public static implicit operator Vec2(PointF p)
    {
        return new Vec2(p.X, p.Y);
    }

J'essaie de convertir un tableau de PointFs en un tableau de Vec2s. Existe-t-il une bonne façon de procéder? Ou devrais-je simplement le sucer et écrire (un autre) convertisseur ou boucle sur les éléments?

53
mpen

La solution LINQ proposée utilisant Cast/'Select' est très bien, mais puisque vous savez que vous travaillez avec un tableau ici, utiliser ConvertAll est plutôt plus efficace et tout aussi simple.

var newArray = Array.ConvertAll(array, item => (NewType)item);

L'utilisation de ConvertAll signifie
a) la matrice n'est répétée qu'une seule fois,
b) l'opération est plus optimisée pour les tableaux (n'utilise pas IEnumerator<T>).

Ne laissez pas le Converter<TInput, TOutput> type vous confond - c'est juste un simple délégué, et vous pouvez donc lui passer une expression lambda, comme indiqué ci-dessus.

91
Noldorin

Pour mettre à jour cette ancienne question, vous pouvez désormais:

myArray.Cast<Vec2>().ToArray();

où myArray contient les objets source et Vec2 est le type vers lequel vous souhaitez caster.

31
Ravi

Cast ne prend pas en compte les conversions implicites définies par l'utilisateur, vous ne pouvez donc pas caster le tableau comme ça. Vous pouvez utiliser select à la place:

myArray.Select(p => (Vec2)p).ToArray();

Ou écrivez un convertisseur:

Array.ConvertAll(points, (p => (Vec2)p));

Ce dernier est probablement plus efficace car la taille du résultat est connue à l'avance.

18
Mark Byers