80 votes

C # Cast tableau entier?

Je vois cette méthode 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 PointF s en un tableau de Vec2 s. 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?

123voto

Noldorin Points 67794

La proposition de solution à l'aide de LINQ Cast/'Select' est bien, mais comme vous savez que vous travaillez avec un tableau ici, à l'aide de ConvertAll est un peu plus efficienct, et tout aussi simple.

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

À l'aide de ConvertAll signifie a) le tableau n'est itéré une fois, deux fois, b) l'opération est plus optimisé pour les tableaux (ne pas utiliser IEnumerator<T>).

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

42voto

Ravi Points 61

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.

22voto

Mark Byers Points 318575

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));
 

Cette dernière est probablement plus efficace car la taille du résultat est connue à l'avance.

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