不同类型的列表?
我喜欢创建一个将从方法传递给方法的数据列表,但是我不能使用结构,因为包含在这个列表中的数据将根据输入而变化。不同类型的列表?
例如
if (x == 1) {
a = 1
b = true
c = 42
d = "hello"
}
if (x == 2) {
a = 2
b = 'g'
c = "sup"
}
我相信我的选择是这样的:
- 创建一个字符串数组或列表,并且投中的数据回到它原来是从字符串。这很麻烦,可能会导致无法解释的输入错误,但不会太糟糕,因为它在运行时都会被检测到。
- 为每种可能性创建一个结构 - 这是否是一种好的做法?
- 不知何故使用泛型。据我所知,虽然泛型是类型安全的,但不是类型严格的,但在使用之前必须将其转换为类型。例如,如果我想在这里列出项目,我需要将它们转换为字符串,就像在解决方案1中发生的情况一样,这使得它无用。
我的问题是,那么这些选项中哪一个最好?还是有一种替代选择使用某种我不知道的泛型类型?每种情况下的可能变量的数量可能会改变,就像它们的类型一样。我希望能够将单个List或Array返回给调用方法,以便它可以适当地处理结果。它将知道如何处理基于a的值的每组数据,因为它将是'动作选择'标识符。我也知道每次将它们投射到物体上并返回是非常紧张的,所以我宁愿避免这种情况。
这可能是很简单,但它已经难倒了我...
.NET中的一般原则是每个类型都可以转换为System.Object(虽然它可能涉及装箱)。您可以使用如下方法:
void Foo(params object[] parameters) { ... }
或者使用System.Collections.ArrayList类。
“问题”是,当你想使用这样一个值,你需要这样的代码:
if (parameters[i] is string)
{
string s = (string) parameters[i];
...
}
对不起,这不是一个代码相关的答案:有可能是设计缺陷隐藏在这样的结构之后。确保你知道你在做什么,否则事情可能会回火。
如果不知道你用事先真正需要的字段的类型,这需要与他们的类型保存数据的方法,像
struct foo {
private object _value;
private string _type;
foo(string myType, object myValue) {
_value = myValue;
_type = myType;
}
}
,然后使用泛型来处理业务逻辑。
您可以使用Dictionary/Hashtable
来表示数据项,然后将这些字典添加到List
。
如果需要,还可以在字典值中添加额外的类型信息。
基本上你需要一个输入到Object的列表,然后是的,你处于一个回退模式。
我的问题是,在结构上,你怎么知道哪些索引是哪种类型的?这听起来像是一个痛苦的解决方案。
如果您确实需要在列表中存储不同类型,请尝试一个包含每种类型成员的结构,以及一个指示表示哪种数据类型的标志。然后使用该结构的通用集合。像(把我的头顶部)
struct FooType
{
public string StringValue;
public bool BoolValue;
public int IntValue;
public char CharValue;
public string DataType;
// You'd probably want constructors too
}
然后泛型列表的内容:
var values = new List<FooType>();
现在,您可以添加和删除使用该类型,列表中的条目,然后这些指示的核心是什么数据真的是。
我还是不喜欢这个答案;这听起来像你的设计可能试图做太多,并可能有重构机会,但由于我没有看到更多的代码或意图,我所能做的就是回答你所问的问题。 :)
为了提供更多信息,基本上这是根据用户的选择尝试解释来自输入字符串的各种数据。如果他们说了一件事情,我需要检查这些数据,然后抓住它,制作一份这些数据及其类型的列表(各种信息都来源于此信息)。 问题是我想让它可扩展,所以我总是可以添加东西而不必遵循严格的结构,并且我不应该在使用时重新设置所有东西。 我喜欢ArrayList的建议,以及重构。我会尝试修改它。 – George 2009-09-07 13:49:46