2014-02-24 11 views
35

Ich möchte den besten Ansatz zum Konvertieren bool[] in object[] in C# .NET 4.0 finden.
Jetzt habe ich diese Variablen:Richtiger Weg zum Verpacken von Bool [] in Objekt [] in C#

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

Alle fein erstellt werden. Für 'clear types', suc wie bool und object, boxing funktioniert einwandfrei (object o = true;). Aber in diesem Fall kann ich tun Umwandlung nur aus einem String-Array auf ein Objektarray, aber nicht von einem boolean-Array:

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

Auch in einigen Methoden, die ich eine Liste von Objektarrays sandte. Wie in der vorangegangenen Fall, ich kann diese (Umwandlung) tut für string, aber nicht für einen boolean-Array:

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[] 

Von einigen Methoden, ich habe einen boolean-Array mit vielen Elementen im Innern ... und die letzte Methode, gibt nach allen Berechnungen als Ergebnis ein Objektarray zurück (manchmal muss es andere Typen zurückgeben und ich möchte es nicht in mehrere Methoden aufteilen).

Während ich return_object_array = boolean_array nicht verwenden kann. Was ist die beste Methode dafür? Schleifen Sie alle Werte in einem booleschen Array und speichern Sie es am schnellsten in einem Objekt-Array?

Was ist der beste/schnellste/korrekteste Ansatz dafür?
Hinweis: Diese Methode ist unter .NET 4.0 geschrieben, aber wenn Sie eine bessere Lösung für .NET 4.5 wissen, würde ich es gerne wissen.

+3

'boolaray.Select (x => (Objekt) x) .ToList();' –

+4

Ich denke, das ist ein X/Y-Problem - Warum wollen Sie eine Reihe von booleans konvertieren möchten eine Reihe von Objekten an erster Stelle? Warum gibt die Methode Arrays verschiedener Typen zurück? Warum arbeitest du mit 'List '? –

+0

Ich kann keine generischen Typen verwenden, da einige Methoden erstellt werden, die die Schnittstelle implementieren (nicht meine Schnittstelle :)). Aber ich weiß, dass es besser ist, Generika zu verwenden. – Atiris

Antwort

76

Es klingt wie Sie müssen nur jeden Wert boxen, richtig? Das ist so einfach wie:

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

Oder auch:

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

(. Wie Castwird Boxen/Unboxing-Operationen durchführen)

Oder etwas effizienter in Bezug auf die richtige Größe zu wissen zu beginnen mit:

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

Alternativ können Sie Ihre APIs auf und nicht auf setzen, um mit object[] zu beginnen. Erwägen Sie stattdessen, generische Methoden/Typen zu verwenden.

EDIT:

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

Dann:

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

Oder:

die Box jedes Mal zu vermeiden, können Sie Ihre eigene Erweiterungsklasse ähnlich den Rahmen ein nmclean zeigte leicht schreiben
object[] objectArray = boolArray.Select(BooleanBoxExtensions.BoxCheaply) 
           .ToArray(); 
+0

Interessant, verwenden Sie 'b' für Lambda, weil der Wert ein Bool ist? – Bobby

+5

@Bobby Sie können jeden Buchstaben oder jedes Wort für das Lambda verwenden, aber einige Leute (einschließlich mir und Jon Skeet) bevorzugen es, einen Buchstaben zu verwenden, der sich auf den Namen der Variablen bezieht. Für ein 'boolArray' würde ich' b' verwenden und für ein 'objectArray' würde ich' o' verwenden. –

+7

Ich gehe oft noch weiter und benutze einen Eigennamen. Viele Menschen haben nur ein vages Verständnis von Lambdas, und eine Kette von ihnen kann wirklich Terror auslösen, was durch einen Namen etwas reduziert werden kann. Für einfache Fälle wie eine Reihe von Bools ist der Mehrwert jedoch wahrscheinlich viel kleiner. – Magus

11

Cast<T> Methode führt Boxen aus.

var castedValues = boolArray.Cast<object>(); 
objectArray = castedValues.ToArray(); 
7
bool[] boolArray = { true, false, true }; 

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