假设我有一个数组,我需要存储字符串值以及双值。我知道我可以将双打存储为字符串,只处理转换,但是可以使用具有两种数据类型的数组吗?
答案 0 :(得分:5)
您可以使用object[]
进行一些类型检查。在访问双打时你会得到一些装箱/拆箱,但无论如何都会比double.Parse()
更快。
另一种方法是创建一个包含两种类型和标记的类:
class StringOrDouble
{
private double d;
private string s;
private bool isString;
StringOrDouble(double d)
{
this.d = d;
isString = false;
}
StringOrDouble(string s)
{
this.s = s;
isString = true;
}
double D
{
get
{
if (isString)
throw new InvalidOperationException("this is a string");
return d;
}
}
string S
{
get
{
if (!isString)
throw new InvalidOperationException("this is a double");
return s;
}
}
bool IsString { get { return isString; } }
}
然后创建一个StringOrDouble数组。这将节省你的一些类型检查和装箱,但会有更大的内存开销。
答案 1 :(得分:3)
确定使用:
object[], ArrayList, or List<Object>;
你必须施放,并可能为双打支付拳击罚金,但他们会允许你存储两种不同的类型。
答案 2 :(得分:2)
不是最有效的用法,但灵活性如何:
var a = new object[] {1,2,3,"paul",5.5}
甚至
var a = new object[] {1,2,3,"paul",5.5, new List<string>() {"apple","banana","pear"} }
答案 3 :(得分:1)
object[]
和ArrayList
是两个不错的选择;这取决于您是需要传统的固定长度数组还是矢量(可变长度数组)。此外,我将其中一个“包装”在一个自定义类中进行一些类型检查,如果字符串和双精度是你可以处理的唯一的东西,你需要能够将它们作为字符串和双精度返回。