如何在C#中获取数组的数据类型?

时间:2014-01-03 22:02:45

标签: c# arrays types

我正在制作一种首先需要“检测”数组数据类型的统计软件。

首先,X [,]是一个 sometype 的数组,可以是所有字符串,全部是双精度,全部是整数或者是所有字符串的组合。

现在,对于每一列X [],我需要知道数据类型。像:

  • 如果一切都是0或1,那么布尔(或二项式)
  • else如果一切都是整数,那么整数
  • else如果一切都是双倍,那么加倍
  • else:String

我需要在C#中使用这样的东西。

2 个答案:

答案 0 :(得分:1)

所以看来你在这里要做的就是找到这里类型的“最低公分母”。集合中所有项目“是”的派生类型最多。

我们将从这个帮助器方法开始,以获取对象的整个类型层次结构(包括它自己):

public static IEnumerable<Type> BaseClassHierarchy(object obj)
{
    Type current = obj.GetType();
    do
    {
        yield return current;
        current = current.BaseType;
    } while (current != null);
}

现在我们可以获取一系列对象,将每个对象映射到它的层次结构,将所有这些序列相互交叉,然后该结果的第一项是所有其他对象共有的最派生类型:

public static Type MostDerivedCommonType(IEnumerable<object> objects)
{
    return objects.Select(o => BaseClassHierarchy(o))
        .Aggregate((a,b)=> a.Intersect(b))
        .First();
}

答案 1 :(得分:0)

一个简单的想法是你可以尝试转换/解析为不同的类型,如果失败,转到下一个类型。一个非常简单的例子是:

foreach (var element in myArray) {
  double parsedDouble; int parsedInt;

  var defaultValue = element.ToString();
  if (Double.TryParse(defaultValue, out parsedDouble)) {
    // you have something that can be used as a double (the value is in "parsedDouble")
  } else if (Int32.TryParse(defaultValue, out parsedInt)){
    // you have something that can be used as an integer (the value is in "parsedInt")
  } else {
    // you have something that can be used as an string (the value is in "defaultValue")
  }
}

我相信这应该可以让你开始。祝你好运!

注意

正如其他人所说的那样 - 最好在C#中使用强类型。在大多数情况下,您可以选择单一类型并使用它而不是执行上述检查。