在C#中将bool []装入对象[]的正确方法

Ati*_*ris 37 c# arrays object

我想找到转换bool[]object[]C#.NET 4.0 的最佳方法.
现在我有这个变量:

object[] objectArray  = new object [] { true, false, true };
string[] stringArray  = new string[]  { "true", "false", "true" };
bool[]   boolArray    = new bool[]    { true, false, true };
Run Code Online (Sandbox Code Playgroud)

一切都很好.对于'clear types',suc as boolobject,拳击工作正常(object o = true;).但在这种情况下,我只能从字符串数组转换为对象数组,但不能从布尔数组转换:

objectArray = stringArray; // OK 
objectArray = boolArray; // WRONG Cannot implicitly convert bool[] to object[]
Run Code Online (Sandbox Code Playgroud)

此外,在某些方法中,我发送一个对象数组列表.与前面的情况一样,我可以为字符串执行此操作(转换),但不能用于布尔数组:

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[]
Run Code Online (Sandbox Code Playgroud)

从某些方法,我有一个布尔数组,里面有很多项......最后一个方法,在所有计算之后,返回一个对象数组作为结果(有时它必须返回其他类型,我不想将它分成多个方法).

然而,我不能使用return_object_array = boolean_array.这样做的最佳方法是什么?循环遍历布尔数组中的所有值并以最快的方式将其存储到对象数组中?

这样做的最佳/最快/最正确的方法是什么?
注意:此方法在.NET 4.0下编写,但如果您知道更好的.NET 4.5解决方案,我想知道它.

Jon*_*eet 77

听起来你只需要打包每个值,对吧?这很简单:

object[] objectArray = boolArray.Select(b => (object) b).ToArray();
Run Code Online (Sandbox Code Playgroud)

甚至:

object[] objectArray = boolArray.Cast<object>().ToArray();
Run Code Online (Sandbox Code Playgroud)

(如Cast 进行装箱/拆箱操作).

或者在知道正确的尺寸方面稍微有效一点:

object[] objectArray = Array.ConvertAll(boolArray, b => (object) b);
Run Code Online (Sandbox Code Playgroud)

另外,改变你的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

object[] objectArray = Array.ConvertAll(boolArray, b => b.BoxCheaply());
Run Code Online (Sandbox Code Playgroud)

要么:

object[] objectArray = boolArray.Select(BooleanBoxExtensions.BoxCheaply)
                                .ToArray();
Run Code Online (Sandbox Code Playgroud)

  • 我经常走得更远,并使用正确的名称.很多人对lambda只有一种模糊的理解,而且它们中的一连串可以真正激发恐怖,这可以通过看到一个名字来减少.然而,对于像bool数组这样的简单情况,增加的值可能要小得多. (7认同)
  • @Bobby你可以使用任何字母或单词作为lambda,但有些人(包括我和Jon Skeet)更喜欢使用与变量名称相关的字母.因此,对于`boolArray`我会使用`b`而对于`objectArray`我会使用`o`. (5认同)

Ser*_*lov 11

Cast<T> 方法执行拳击.

var castedValues = boolArray.Cast<object>();
objectArray = castedValues.ToArray();
Run Code Online (Sandbox Code Playgroud)


EZI*_*EZI 7

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

var objArray = Array.ConvertAll(boolArray, x => (object)x);
Run Code Online (Sandbox Code Playgroud)