【发布时间】:2011-04-09 09:14:10
【问题描述】:
假设我有一个数组,我需要存储字符串值和双精度值。我知道我可以将双精度数存储为字符串,并且只处理转换,但是可以使用具有两种数据类型的数组吗?
【问题讨论】:
-
性能有多重要?如果是这样,我可以尝试编写一个自定义类,分别存储它们但将它们作为一个公开。
-
如何检测你拔出的是双排还是字符串。它们总是按相同的顺序排列吗?
假设我有一个数组,我需要存储字符串值和双精度值。我知道我可以将双精度数存储为字符串,并且只处理转换,但是可以使用具有两种数据类型的数组吗?
【问题讨论】:
不是最有效的用法,但灵活性如何:
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"} }
【讨论】:
您可以使用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 数组。这将使您免于进行一些类型检查和装箱,但会产生更大的内存开销。
【讨论】:
object[] 和 ArrayList 是两个不错的选择;这取决于您是否需要传统的固定长度数组或向量(可变长度数组)。此外,如果字符串和双精度是您可以处理的唯一事情,并且您需要能够将它们作为字符串和双精度取出,我会将其中一个“包装”在一个自定义类中,该类进行一些类型检查。
【讨论】:
确定使用:
object[], ArrayList, or List<Object>;
您必须施放,并且可能会为双打支付拳击罚金,但它们将允许您存储两种不同的类型。
【讨论】: