2012-02-07 9 views
7

Relacionados: A list of multiple data types?¿Almacena diferentes tipos dentro de una lista?

Quiero saber cómo almacenar diferentes tipos de matriz (incluidos los tipos de sistema) dentro de una matriz.

La pregunta anterior cubría cómo crear una lista que solo permita las clases definidas por el usuario mediante el uso de interfaces. Pero, ¿y si quiero una lista que solo acepte dobles y cadenas? ¿Qué hay de los dobles y una clase que escribí? ¿Qué pasa con una lista que aceptará solo una clase que escribió y una clase que alguien más escribió (por lo que no puedo agregar una interfaz a la clase de terceros, creo).

Consideré usar List<object>, pero no sé si esa es la mejor práctica aceptada.

+0

Como probablemente sepa, soy bastante nuevo en C#. – Michael0x2a

+6

¿Por qué querrías hacer eso? Si crees que tienes esa necesidad, probablemente haya una mejor manera de acercarte a lo que estás construyendo. Especialmente si los tipos no tienen ninguna relación entre ellos. –

+0

Sí, pero ¿y si quiero una lista que solo acepte dobles y cadenas, y nada más? – Michael0x2a

Respuesta

4

Puede especificar no solo tipos personalizados. List<int>, List<double>, List<string> funcionará también. Si necesita almacenar tipos mixtos, debe especificar la clase base más cercana para todos los tipos. En List<object> se puede almacenar instancia de cualquier tipo.

+0

Esto, sin embargo, no le permitirá acceder a las propiedades de los tipos dentro de la matriz. Es decir. Si intenta tener una 'List ', asígnele 'List ' para incluir type1 y type2. No podrá buscar 'List.FirstOrDefault (i => i.PropertyOfType1AndType2)' (suponiendo que type1 y type2 tengan la propiedad similar). –

+0

@FranciscoSoto Creo que tienes razón. Esto no debería ser necesario si está escribiendo su código desde cero. Es importante escribir código de calidad y bien pensado. Aunque a veces es importante saber cómo hacer algo sucio si necesitas hacer algo de magia: complacer a un cliente por ejemplo. –

2

Puede crear una colección personalizada en el cual método Add(), que sólo acepta dobles y cuerdas, algo así como a implementar:

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

Pero, para ser honesto, realmente no puedo pensar en ninguna manera que necesitaría una colección que acepte solo estos dos tipos. Es probable que pueda resolver el problema de otra manera ...

1

debe crear una clase

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

A continuación, sólo crear una matriz de esa clase. Esta clase puede tener los tipos que desee, esa es la belleza de tener objetos en un lenguaje orientado a objetos.

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

Si usted está dispuesto a regalar la seguridad de tipos puede utilizar un ArrayList, que era la única manera de utilizar una lista de productos genéricos pre cosas.

Puede ponerle un código de envoltura para que solo acepte dobles y cadenas.

+0

¿Puedes agregar algo a una ArrayList? Por ejemplo, int, string, Person? ¿Cómo se hace para obtener un elemento? tienes que lanzarlo? – Loaderon

1

También puede utilizar? opción, haga una lista del siguiente tipo:

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

De esta manera puede seleccionar si ninguno, uno o ambos pueden tener un valor.

O si no te gusta las funciones HasValue/Valor:

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; } 
} 

De esta manera la propiedad typeFilled decide lo que está vacío. Puede agregar validación para evitar que se establezca dos veces, etc.

Cuestiones relacionadas