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 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?
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.
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.
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.