正确的方式来装箱bool 到C#中的对象
我想find在C#.NET 4.0中将bool[]
转换为object[]
的最佳方法。
现在我有这个variables:
object[] objectArray = new object [] { true, false, true }; string[] stringArray = new string[] { "true", "false", "true" }; bool[] boolArray = new bool[] { true, false, true };
所有创build好。 对于“明确的types”,作为bool
和object
, 拳击工作正常( object o = true;
)。 但在这种情况下,我可以只从string数组转换为对象数组,而不是从一个布尔数组:
objectArray = stringArray; // OK objectArray = boolArray; // WRONG Cannot implicitly convert bool[] to object[]
另外,在一些方法中,我发送一个对象数组的列表。 和前面的例子一样,我可以对string进行转换,但是不能用于布尔数组:
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[]
从一些方法,我有一个布尔数组里有很多项目…最后的方法,所有计算后,返回一个对象数组作为结果(有时它必须返回其他types,我不想分裂成多个方法)。
而我不能使用return_object_array = boolean_array
。 这样做的最好方法是什么? 循环遍历布尔数组中的所有值,并以最快的方式将其存储到对象数组中?
什么是最好/最快/最正确的方法来做到这一点?
注意:这个方法是在.NET 4.0下编写的,但如果你知道.NET 4.5的更好的解决scheme,我想知道它。
这听起来像你只需要把每个值,对不对? 这很简单:
object[] objectArray = boolArray.Select(b => (object) b).ToArray();
甚至:
object[] objectArray = boolArray.Cast<object>().ToArray();
( Cast
将执行装箱/取消装箱操作。)
或者从了解正确的大小开始,稍微更高效一些:
object[] objectArray = Array.ConvertAll(boolArray, b => (object) b);
或者,更改您的API不需要开始的object[]
。 考虑使用generics方法/types。
编辑:为了避免每次拳击,你可以很容易地写你自己的扩展类相似的框架一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();
Cast<T>
方法执行装箱。
var castedValues = boolArray.Cast<object>(); objectArray = castedValues.ToArray();
bool[] boolArray = { true, false, true }; var objArray = Array.ConvertAll(boolArray, x => (object)x);