在列表中存储不同类型?

时间:2012-02-07 22:11:32

标签: c# arrays

相关:A list of multiple data types?

我想知道如何在数组中存储不同的数组类型(包括系统类型)。

上述问题涉及如何使用接口创建仅允许用户定义的类的列表。但是,如果我想要一个只接受双打和字符串的列表呢?我写的双打和课程怎么样?如果列表只接受一个写入的类和一个别人写的类(我认为我不能在第三方类中添加一个接口)。

我考虑使用List<object>,但我不知道这是否是公认的最佳做法。

6 个答案:

答案 0 :(得分:5)

您不仅可以指定自定义类型。 List<int>List<double>List<string>也会有效。如果需要存储混合类型 - 您需要为所有类型指定最接近的基类。在List<object>中可以存储任何类型的实例。

答案 1 :(得分:4)

如果您愿意放弃类型安全,可以使用ArrayList,这是使用预先通用内容列表的唯一方法。

你可以在它周围放一些包装代码,只接受双打和字符串。

答案 2 :(得分:2)

您可以创建一个自定义集合,在其中实现只接受双精度和字符串的Add()方法,如:

void Add(object toAdd)
{
     if (toAdd is string)
         // add into inner collection ... 
      ... (same for double)
}

但是,说实话,我真的想不出你需要一个只接受这两种类型的集合的方法。您可以通过其他方式解决问题...

答案 3 :(得分:1)

你应该创建一个类

public class MyClass
{
    public string x {get;set;}
    public double y{get;set;}
}

然后只需创建该类的数组。这个类可以有你想要的任何类型,这就是在面向对象语言中拥有对象的美妙之处。

public MyClass[] someList=new MyClass[insert_number_of_elements];

答案 4 :(得分:1)

你也可以使用?选项,列出以下类型:

public class MyClass
{
    public string? x {get;set;}
    public double? y {get;set;}
}

通过这种方式,您可以选择是否一个,一个或两个都可以有值。

或者,如果你不喜欢HasValue / Value函数:

public class MyClass
{
    public enum EType { String, Double };

    EType TypeFilled {get; private set }

    string _x;
    public string X { get { return _x; }; set { _x = value; TypeFilled = EType.String; }
    double y;
    public double y { get { return _y; }; set { _y = value; TypeFilled = EType.Double; }
}

这样,typeFilled属性决定填充的内容。您可以添加验证以防止被设置两次等。

答案 5 :(得分:0)

我知道我参加聚会有点晚了,但是我一直都这样做。特别是在初始化新类时。我喜欢在main方法之外进行繁重的工作,因此我使用对象数组来处理它。 Object[]使您可以将所需的内容放入数组中。然后,当您返回数组时,将数组值强制转换为所需的值。例如:

int NewInt = (int)InitArray[0];
string NewString = (String)InitArray[1];
double NewDouble = (Double)InitArray[2];

在所有情况下,这都不是最优雅的解决方案,但是对于我所做的工作,它肯定可以很好地处理单个输出问题。