在列表中存储不同类型?

问题描述 投票:0回答:7

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

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

上述问题涵盖了如何使用接口创建一个仅允许用户定义类的列表。但是如果我想要一个只接受双精度数和字符串的列表怎么办?双打和我写的课程怎么样?一个仅接受 a 编写的类和其他人编写的类的列表怎么样(所以我认为我无法向第 3 方类添加接口)。

我考虑过使用

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

c# arrays
7个回答
9
投票

您不仅可以指定自定义类型。

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


5
投票

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

您可以在其周围放置一些包装器代码以仅接受双精度数和字符串。


3
投票

你应该创建一个类

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

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

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

2
投票

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

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

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


2
投票

您还可以使用?选项,制作以下类型的列表:

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


0
投票

我知道我参加聚会有点晚了,但我一直这样做。特别是当我初始化新课程时。我喜欢在主方法之外完成繁重的工作,因此我使用对象数组来处理它。

Object[]
可让您将想要的任何内容放入数组中。然后,当您返回数组时,您可以将数组值转换为您想要的任何值。例如:

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

这可能不是所有情况下最优雅的解决方案,但对于我所做的工作来说,它确实可以很好地处理单一输出问题。


0
投票

您可以使用

List<dynamic>()
但这不是类型安全的,可能会在运行时产生错误。欲了解更多信息动态类型c#

© www.soinside.com 2019 - 2024. All rights reserved.