各种类型的清单?

时间:2009-09-07 13:30:55

标签: c# .net arrays list types

我想创建一个将从一个方法传递给另一个方法的数据列表,但是我不能使用结构,因为此列表中包含的数据会因输入而异。

例如

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

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

我相信我的选择是:

  1. 创建一个数组或字符串列表,并将数据转换回原来的字符串。这很麻烦,可能导致无法解释的输入错误,但不会太糟糕,因为它们都会在运行时检测到。
  2. 为每种可能性创建一个结构 - 这是不是很好的做法?
  3. 以某种方式使用泛型。据我所知,虽然泛型是类型安全的而不是类型严格的,但它们必须在使用之前转换为类型。例如,如果我想要一个项目列表,我需要将它们转换为字符串,就像解决方案1一样,这使得它无用。
  4. 我的问题是,哪些选项最好?或者是否有一种替代选项使用某种我不知道的泛型类型?每种情况下可能的变量数量可能会发生变化,就像它们的类型一样。我希望能够将单个List或Array返回给调用方法,以便它可以适当地处理结果。它将知道如何根据a的值处理每组数据,因为它将是“动作选择”标识符。我也知道每次将它们投射到物体上并且非常密集,所以我宁愿避免这种情况。

    这可能很简单,但让我难过......

5 个答案:

答案 0 :(得分:4)

由于您事先不知道列表将包含哪些内容,因此使用ArrayList看起来很合适。

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

答案 1 :(得分:3)

.NET中的一般原则是每个类型都可以强制转换为System.Object(尽管它可能涉及装箱)。您可以使用

之类的方法
void Foo(params object[] parameters) { ... }

或使用System.Collections.ArrayList类。

“问题”是,当您想要使用这样的值时,您将需要以下代码:

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

答案 2 :(得分:2)

抱歉,这不是与代码相关的答案:可能是隐藏在此类构造背后的错误设计。确保你知道自己在做什么,否则事情可能会重新开始。

如果不知道您事先使用的字段类型确实是必需的,则需要一种方法来保存数据类型,例如

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

然后使用Generics处理业务逻辑。

答案 3 :(得分: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>();

现在,您可以使用该类型添加和删除列表中的条目,这将指示核心数据的真实含义。

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

答案 4 :(得分:1)

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

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