JaneDoe
JaneDoe

Reputation: 39

Returning a List<> inheritance C#

class cuentaBancaria
{
    public cuentaBancaria()
    {

    }
    public cuentaBancaria(string nombreCliente, string numCuenta, double tipoInteres, double saldo)
    {
        this.nombreCliente = nombreCliente;
        this.numCuenta = numCuenta;
        this.tipoInteres = tipoInteres;
        this.saldo = saldo;
    }
    public string nombreCliente { get; set; }
    public string numCuenta { get; set; }
    public double tipoInteres { get; set; }
    public double saldo { get; set; }

    public static List<cuentaBancaria> cuentas = new List<cuentaBancaria>()
    {
        new cuentaBancaria ("John Doe", "123456", 1.5, 159),
        new Tarjeta ("John Doe", "123456" , 1.5, 159, "123456789012", "John Doe", TipoTarjeta.CREDITO)
     };
}

TipoTarjeta:

enum TipoTarjeta
{
    CREDITO,
    DEBITO,
    MONEDERO,
    FINANCIACION
}

Tarjeta:

class Tarjeta : cuentaBancaria
{
    public Tarjeta()
    {

    }
    public Tarjeta(string nombreCliente, string numCuenta, double tipoInteres, double saldo, string numTarjeta, string nombre, TipoTarjeta tipoTarjeta)
    {
        base.nombreCliente = nombreCliente;
        base.numCuenta = numCuenta;
        base.tipoInteres = tipoInteres;
        base.saldo = saldo;
        this.numTarjeta = numTarjeta;
        this.nombre = nombre;
        this.tipoTarjeta = tipoTarjeta;
    }
    public string numTarjeta { get; set; }
    public string nombre { get; set; }
    public TipoTarjeta tipoTarjeta { get; set; }
}

I want to return the elements that has a TipoTarjeta.XXX but when I try the

cuentas.Where(c => c.tipoTarjeta == tipo) 

I get the error that is an element of the child (Tarjeta) not cuentaBancaria.

How can I only get those elements with that type?

Upvotes: 1

Views: 170

Answers (2)

Mike Hofer
Mike Hofer

Reputation: 17022

You have a type mismatch.

Your function is declared such that it returns List<cuentaBancaria>, but Where is a LINQ extension method that returns an IEnumerable<cuentBancaria>.

To resolve your issue, add a call to the ToList() extension method as follows:

cuentas.Where(c => c.tipoTarjeta == tipo).ToList()

UPDATE

I copied your code to VSCode and this version of Main works for me. From what I could tell, you needed to reference cuentas through cuentaBancaria; also, the property you were referencing in the Where clause was incorrect, based on the class definition.

    public static void Main()
    {
      var tipo = 3.15;
      var result = cuentaBancaria.cuentas.Where(c => c.tipoInteres == tipo).ToList();
      foreach (var item in result)
      {
        Console.WriteLine(item.tipoInteres);
      }
    }

Upvotes: 1

devNull
devNull

Reputation: 4219

You first need to filter the list to only the types of Tarjeta, and then you can filter by properties of Tarjeta. You can do this using .OfType<T>() in LINQ:

cuentas.OfType<Tarjeta>().Where(c => c.tipoTarjeta == tipo)

Upvotes: 1

Related Questions