将不同类型存储在列表中

本文关键字:列表 存储 同类型 | 更新日期: 2023-09-27 18:23:53

相关:多个数据类型的列表?

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

上面的问题涵盖了如何通过使用接口创建一个只允许用户定义类的列表。但是,如果我想要一个只接受双打和弦乐的列表,该怎么办?双打和我写的一节课怎么样?那么一个只接受a编写的类和其他人编写的类的列表呢(所以我想我不能向第三方类添加接口)。

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

将不同类型存储在列表中

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

如果你愿意放弃类型安全性,你可以使用ArrayList,这是使用泛型之前的东西列表的唯一方法。

您可以在它周围放置一些包装器代码,以便只接受双精度和字符串。

您应该创建一个类

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

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

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

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

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

但是,老实说,我真的想不出你需要一个只接受这两种类型的集合。你也许可以用其他方法解决这个问题。。。

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

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属性决定填充的内容。您可以添加验证以防止设置两次等。

我知道我参加聚会有点晚,但我总是这样。尤其是在初始化新类时。我喜欢在主方法之外做繁重的工作,所以我使用对象数组来处理它。Object[]可以让你在数组中放入你想要的任何东西。然后,当返回数组时,将数组值强制转换为所需的值。例如:

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

这可能不是所有情况下最优雅的解决方案,但就我所做的工作而言,它确实很好地处理了单个输出问题。