【问题标题】:Convert an object that is an array to an array of objects将作为数组的对象转换为对象数组
【发布时间】:2023-03-12 08:00:02
【问题描述】:

如何(在 C# 中)将作为数组的对象转换为对象数组

格式如下:

bool Compare(object valueToCompare)
{
   if(valueToCompare.IsArray())
   {
      foreach(var value in (valueToCompare as Array)){
          if(Compare(value));
             return true;
          return Compare(value);
      }
   }
   else
       return Compare(valueToCompare);
}

注意:上面的代码并没有做太多的事情。我只是在做原型。

【问题讨论】:

  • 这个函数的作用是什么?
  • 您只会比较数组中的第一个对象。在第一个值上返回 Compare 的结果将忽略数组中的所有其他值。

标签: c# arrays type-conversion


【解决方案1】:

假设以下为真:

  • valueToCompare 是一个引用类型数组(不是int[]DateTime[]
  • valueToCompare 的数组是一维的(因此要么声明为一维数组,要么声明为锯齿状数组)

您可以直接投射到 object[] 而不是 Array

bool Compare(object valueToCompare)
{
   Type t = valueToCompare.GetType();

   if(t.IsArray() && !t.GetElementType().IsValueType && t.GetRank() == 1)
   {
      foreach(var value in (valueToCompare as object[]))
          return Compare(value);
   }
   else
   {
       return Compare(valueToCompare);
   }
}

如果你的数组是值类型,那么你基本上就没有运气了。

如果您的数组是多维的,那么您只需要编写类似的检查来说明您想要支持的尽可能多的维度。

注意:正如您所写,此函数只会递归调用自身(else 分支使用相同的参数调用自身)并最终生成StackOverflowException。我不相信这是你打算做的,但我保持原样,因为我不知道你实际上想要做什么。

此外,这实际上不会编译。我不确定您的循环打算比较什么;实际上,它只会与数组的第一个元素进行比较,但如果数组为空,则不会返回值(因此会出现编译错误)。

在这里做什么?

【讨论】:

  • 非数组分支会不会导致栈溢出?
  • @n8wrl:肯定会的;我什至没有检查那部分代码。
  • 它会导致堆栈溢出
  • @Tawani:正如它所写的那样,它会的。您可能想澄清您的问题,或者至少发布一些更接近您实际操作的示例代码。
  • 请注意,只有元素类型为引用类型的数组才能转换为 object[]。一个结构数组(大多数情况下)只能转换为这种结构的数组。 (我说“大部分”是因为 CLR 确实允许一些不寻常的转换,比如 int[] 到 uint[]。)
猜你喜欢
  • 2021-05-03
  • 2018-12-04
  • 2021-06-16
  • 1970-01-01
  • 2019-10-22
  • 2019-07-29
  • 1970-01-01
相关资源
最近更新 更多