Dime, por favor, ¿cómo puedo devolver un objeto con el tipo IEnumerable <'a>? Mi código debería devolver una lista de objetos con objetos anidados, por ejemplo:

[0] LG
{
  [0].LG G3
  [1].LG G4
}
[1] Xiaomi
{
...
}

Ahora obtengo un error de compilación y no puedo encontrar el tipo de método para ello:

Error   CS0266  Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<<anonymous type: string Name, System.Collections.Generic.IEnumerable<ConsoleApp1.Phone> Phones>>' to 'System.Collections.Generic.IEnumerable<ConsoleApp1.Phone>'. An explicit conversion exists (are you missing a cast?)

Mi código:

class Phone
{
    public string Name { get; set; }
    public string Company { get; set; }
}

class Program
    {
        static void Main(string[] args)
        {
            IEnumerable<Phone> GetInfo()
            {
                List<Phone> phones = new List<Phone>()
            {
                    new Phone {Name="Lumia 430", Company="Microsoft" },
                    new Phone {Name="Mi 5", Company="Xiaomi" },
                    new Phone {Name="LG G 3", Company="LG" },
                    new Phone {Name="iPhone 5", Company="Apple" },
                    new Phone {Name="Lumia 930", Company="Microsoft" },
                    new Phone {Name="iPhone 6", Company="Apple" },
                    new Phone {Name="Lumia 630", Company="Microsoft" },
                    new Phone {Name="LG G 4", Company="LG" }
            };

                var result = (from phone in phones
                        group phone by phone.Company into g
                        select new
                        {
                            Name = g.Key,
                            Phones = from p in g select p
                        });

                return result;
            }

            //my code with GetInfo()
        }
    }
0
just 26 nov. 2021 a las 12:32

2 respuestas

La mejor respuesta

Puede devolver tupla con nombre , por ejemplo, (string company, Phone[] phones) en lugar de clase anónima :

IEnumerable<(string company, Phone[] phones)> GetInfo() {
  ...

  return phones
    .GroupBy(phone => phone.Company)
    .Select(group => (group.Key, group.ToArray())); 
}  
3
Dmitry Bychenko 26 nov. 2021 a las 12:37
Muchas gracias partido, es trabajo!
 – 
just
26 nov. 2021 a las 12:56

El IEnumerable que devuelve no es del tipo de teléfono, es más un Dictionary<string,IEnumerable<Phone>>

O use otra clase como PhoneInfo

public class Phone
{
    public string Name { get; set; }
    public string Company { get; set; }
}
public class PhoneInfo
{
    public string Name { get; set; }
    public List<Phone> Phones { get; set; } 
}

class Program
{
    static void Main(string[] args)
    {
        
        IEnumerable<PhoneInfo> GetInfo()
        {
            List<Phone> phones = new List<Phone>()
            {
                    new Phone {Name="Lumia 430", Company="Microsoft" },
                    new Phone {Name="Mi 5", Company="Xiaomi" },
                    new Phone {Name="LG G 3", Company="LG" },
                    new Phone {Name="iPhone 5", Company="Apple" },
                    new Phone {Name="Lumia 930", Company="Microsoft" },
                    new Phone {Name="iPhone 6", Company="Apple" },
                    new Phone {Name="Lumia 630", Company="Microsoft" },
                    new Phone {Name="LG G 4", Company="LG" }
            };

            var result = (from phone in phones
                          group phone by phone.Company into g
                          select new PhoneInfo
                          {
                              Name = g.Key,
                              Phones = (from p in g select p).ToList()
                          });

            return result;
        }

        //my code with GetInfo()
    }
}
3
Mucksh 26 nov. 2021 a las 12:41
Gracias muy partido, su trabajo también!
 – 
just
26 nov. 2021 a las 12:56