Подтвердить что ты не робот

Правильный способ бокса bool [] в объект [] в С#

Я хочу найти наилучший подход для преобразования bool[] в object[] в С#.NET 4.0.
Теперь у меня есть следующие переменные:

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

Все создаются отлично. Для "четких типов", как bool и object, бокс отлично работает (object o = true;). Но в этом случае я могу преобразовать только из строкового массива в массив объектов, но не из логического массива:

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

Кроме того, в некоторых методах я отправляю список массивов объектов. Как и в предыдущем случае, я могу сделать это (преобразование) для строки, но не для логического массива:

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

Из некоторых методов у меня есть логический массив с множеством элементов внутри... и последний метод после всех вычислений возвращает массив объектов в результате (иногда он должен возвращать другие типы, и я не хочу делиться это несколько методов).

В то время как я не могу использовать return_object_array = boolean_array. Каков наилучший метод для этого? Перебирает ли все значения в булевом массиве и сохраняет его в массив объектов самым быстрым способом?

Каков наилучший/самый быстрый/самый правильный подход для этого?
Примечание. Этот метод написан в .NET 4.0, но если вы знаете лучшее решение для .NET 4.5, я бы хотел его знать.

4b9b3361

Ответ 1

Похоже, вам просто нужно поставить каждое значение, не так ли? Это так просто, как:

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

Или даже:

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

(As Cast будет выполнять операции по боксу/распаковке.)

Или немного более эффективно с точки зрения знания правильного размера для начала:

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

В качестве альтернативы, измените свои API-интерфейсы, чтобы не начинать с object[]. Вместо этого используйте вместо этого общие методы/типы.

РЕДАКТИРОВАТЬ: Чтобы избежать бокса каждый раз, вы можете легко написать свой собственный класс расширения, подобный структуре, которую показал nmclean:

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

Тогда:

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

Или:

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

Ответ 2

Cast<T> метод выполняет бокс.

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

Ответ 3

bool[] boolArray = { true, false, true };

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