Правильный способ бокса 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, я бы хотел его знать.
Ответы
Ответ 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);