2009-09-07 107 views
4

我喜欢创建一个将从方法传递给方法的数据列表,但是我不能使用结构,因为包含在这个列表中的数据将根据输入而变化。不同类型的列表?

例如

if (x == 1) { 
    a = 1 
    b = true 
    c = 42 
    d = "hello" 
} 

if (x == 2) { 
    a = 2 
    b = 'g' 
    c = "sup" 
} 

我相信我的选择是这样的:

  1. 创建一个字符串数组或列表,并且投中的数据回到它原来是从字符串。这很麻烦,可能会导致无法解释的输入错误,但不会太糟糕,因为它在运行时都会被检测到。
  2. 为每种可能性创建一个结构 - 这是否是一种好的做法?
  3. 不知何故使用泛型。据我所知,虽然泛型是类型安全的,但不是类型严格的,但在使用之前必须将其转换为类型。例如,如果我想在这里列出项目,我需要将它们转换为字符串,就像在解决方案1中发生的情况一样,这使得它无用。

我的问题是,那么这些选项中哪一个最好?还是有一种替代选择使用某种我不知道的泛型类型?每种情况下的可能变量的数量可能会改变,就像它们的类型一样。我希望能够将单个List或Array返回给调用方法,以便它可以适当地处理结果。它将知道如何处理基于a的值的每组数据,因为它将是'动作选择'标识符。我也知道每次将它们投射到物体上并返回是非常紧张的,所以我宁愿避免这种情况。

这可能是很简单,但它已经难倒了我...

+0

为了提供更多信息,基本上这是根据用户的选择尝试解释来自输入字符串的各种数据。如果他们说了一件事情,我需要检查这些数据,然后抓住它,制作一份这些数据及其类型的列表(各种信息都来源于此信息)。 问题是我想让它可扩展,所以我总是可以添加东西而不必遵循严格的结构,并且我不应该在使用时重新设置所有东西。 我喜欢ArrayList的建议,以及重构。我会尝试修改它。 – George 2009-09-07 13:49:46

回答

4

既然你不事先知道这个列表将包含这样做,它看起来像一个良好的情况下使用的ArrayList

如果要使用密钥返回值,请考虑使用Hashtable

3

.NET中的一般原则是每个类型都可以转换为System.Object(虽然它可能涉及装箱)。您可以使用如下方法:

void Foo(params object[] parameters) { ... } 

或者使用System.Collections.ArrayList类。

“问题”是,当你想使用这样一个值,你需要这样的代码:

if (parameters[i] is string) 
    { 
     string s = (string) parameters[i]; 
     ... 
    } 
2

对不起,这不是一个代码相关的答案:有可能是设计缺陷隐藏在这样的结构之后。确保你知道你在做什么,否则事情可能会回火。

如果不知道你用事先真正需要的字段的类型,这需要与他们的类型保存数据的方法,像

struct foo { 
    private object _value; 
    private string _type; 
    foo(string myType, object myValue) { 
     _value = myValue; 
     _type = myType; 
    } 
} 

,然后使用泛型来处理业务逻辑。

1

您可以使用Dictionary/Hashtable来表示数据项,然后将这些字典添加到List

如果需要,还可以在字典值中添加额外的类型信息。

2

基本上你需要一个输入到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>(); 

现在,您可以添加和删除使用该类型,列表中的条目,然后这些指示的核心是什么数据真的是。

我还是不喜欢这个答案;这听起来像你的设计可能试图做太多,并可能有重构机会,但由于我没有看到更多的代码或意图,我所能做的就是回答你所问的问题。 :)