【问题标题】:Storing different types inside a list?在列表中存储不同的类型?
【发布时间】:2012-02-29 09:11:44
【问题描述】:

相关:A list of multiple data types?

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

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

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

【问题讨论】:

  • 如您所知,我对 C# 还是很陌生。
  • 你为什么要这样做?如果您认为自己有这种需求,那么可能有更好的方法来处理您正在构建的内容。特别是如果类型之间没有任何关系。
  • 是的,但是如果我想要一个只接受双精度和字符串而不接受其他任何内容的列表怎么办?
  • @FranciscoSoto 我同意......每次我处理有人使用 List<object> 的代码时,都会出现运行时错误的奇妙世界。
  • 项目是否交错?就像一个字符串,然后是一个双精度数,然后是一个字符串,等等。其中每个字符串都与双精度数相关?如果是这样,请使用 List>

标签: c# arrays


【解决方案1】:

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

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

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

【讨论】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 你能向 ArrayList 添加任何东西吗?例如,int、string、Person?你如何获得一个元素?你必须投吗?
      【解决方案4】:

      你应该创建一个类

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

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

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • 但是,这将不允许您访问数组内类型的属性。 IE。如果您尝试使用List<type1|type2>,则将其命名为List<object> 以包含type1 和type2。您将无法搜索List.FirstOrDefault(i => i.PropertyOfType1AndType2)(假设 type1&type2 具有相似的属性)。
          • @FranciscoSoto 我认为你是对的。如果您从头开始编写代码,则不需要这样做。编写高质量、经过深思熟虑的代码很重要。虽然有时如果你需要做一些魔法,知道如何做一些肮脏的事情很重要——例如取悦客户。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-06
          • 2013-11-28
          • 1970-01-01
          • 2017-01-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多