我想找到在C#.NET 4.0中将bool[]
转换为object[]
的最佳方法。
现在我有了这些变量:
object[] objectArray = new object [] { true, false, true };
string[] stringArray = new string[] { "true", "false", "true" };
bool[] boolArray = new bool[] { true, false, true };
一切都很好。对于“明确类型”,成功为bool
和object
,boxing正常(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解决方案,我想知道它。
答案 0 :(得分:77)
听起来你只需要打包每个值,对吧?这很简单:
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[]
开头。请考虑使用通用方法/类型。
编辑:为了避免每次拳击,您可以轻松编写自己的扩展类,类似于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();
答案 1 :(得分:11)
Cast<T>
方法执行装箱。
var castedValues = boolArray.Cast<object>();
objectArray = castedValues.ToArray();
答案 2 :(得分:7)
bool[] boolArray = { true, false, true };
var objArray = Array.ConvertAll(boolArray, x => (object)x);