37 votes

Comment transformer un bool[] en object[] en C# ?

Je veux trouver la meilleure approche pour convertir bool[] en object[] en C# .NET 4.0.
Maintenant, j'ai ces variables :

object[] objectArray  = new object [] { true, false, true };
string[] stringArray  = new string[]  { "true", "false", "true" };
bool[]   boolArray    = new bool[]    { true, false, true };

Tous sont bien créés. Pour les "types clairs", comme bool y object , boxe fonctionne bien ( object o = true; ). Mais dans ce cas, je ne peux effectuer la conversion que d'un tableau de chaînes de caractères vers un tableau d'objets, mais pas d'un tableau de booléens :

objectArray = stringArray; // OK 
objectArray = boolArray; // WRONG Cannot implicitly convert bool[] to object[]

De plus, dans certaines méthodes, j'envoie une liste de tableaux d'objets. Comme dans le cas précédent, je peux le faire (conversion) pour une chaîne de caractères, mais pas pour un tableau de booléens :

List<object[]> testList;
testList = new List<object[]>() { objectArray }; // OK
testList = new List<object[]>() { stringArray }; // OK
testList = new List<object[]>() { boolArray };   // WRONG - I can not add bool[] into object[]

A partir de certaines méthodes, j'ai un tableau de booléens avec de nombreux éléments à l'intérieur ... et la dernière méthode, après tous les calculs, renvoie un tableau d'objets comme résultat (parfois il doit retourner d'autres types et je ne veux pas le diviser en plusieurs méthodes).

Alors que, je ne peux pas utiliser return_object_array = boolean_array . Quelle est la meilleure méthode pour y parvenir ? La méthode la plus rapide consiste-t-elle à boucler sur toutes les valeurs d'un tableau de booléens et à les stocker dans un tableau d'objets ?

Quelle est la meilleure approche / la plus rapide / la plus correcte pour y parvenir ?
Note : Cette méthode est écrite sous .NET 4.0, mais si vous connaissez une meilleure solution pour .NET 4.5, j'aimerais la connaître.

77voto

Jon Skeet Points 692016

On dirait qu'il suffit d'encadrer chaque valeur, non ? C'est aussi simple que ça :

object[] objectArray = boolArray.Select(b => (object) b).ToArray();

Ou même :

object[] objectArray = boolArray.Cast<object>().ToArray();

(Comme Cast sera effectuer des opérations de mise en boîte et de mise hors boîte).

Ou de manière un peu plus efficace en connaissant la bonne taille pour commencer :

object[] objectArray = Array.ConvertAll(boolArray, b => (object) b);

Alternativement, changez vos APIs en pas exiger un object[] pour commencer. Envisagez plutôt d'utiliser des méthodes/types génériques.

EDIT : Pour éviter la mise en boîte à chaque fois, vous pouvez facilement écrire votre propre classe d'extension similaire au framework que nmclean a montré :

public static class BooleanBoxExtensions
{
    private static readonly object BoxedTrue = true;
    private static readonly object BoxedFalse = false;

    public static object BoxCheaply(this bool value)
    {
        return value ? BoxedTrue : BoxedFalse;
    }
}

Ensuite :

object[] objectArray = Array.ConvertAll(boolArray, b => b.BoxCheaply());

Ou :

object[] objectArray = boolArray.Select(BooleanBoxExtensions.BoxCheaply)
                                .ToArray();

11voto

Sergey Metlov Points 6670

Cast<T> effectue la mise en boîte.

var castedValues = boolArray.Cast<object>();
objectArray = castedValues.ToArray();

7voto

EZI Points 6182
bool[] boolArray = { true, false, true };

var objArray = Array.ConvertAll(boolArray, x => (object)x);

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