Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

388
Visualizações
Linq: Agrupar por que agrupa los resultados de manera diferente según una variable (enum por ejemplo)

Estoy tratando de ejecutar una consulta en la que la cláusula 'GroupBy' agrupará los resultados de manera diferente según, por ejemplo, un valor de enumeración que estaría vinculado a un cuadro combinado, etc.

Intenté hacer esto con un caso de cambio, pero resultó en el error del compilador CS0411 en la cláusula 'GroupBy', porque según tengo entendido, el tipo de objeto devuelto por la lambda será diferente según el caso que se ejecute.

¿Cómo puedo lograr perfectamente esta funcionalidad?

Adjunto un ejemplo mínimo del problema a continuación, como un programa de consola.

 class Program { static List<Person> People; enum GroupBy { Month, Year } static void Main(string[] args) { People = new List<Person>(); People.Add(new Person() { Dob = new DateTime(2000,10,1), Name = "James", IsSelected = false }); People.Add(new Person() { Dob = new DateTime(2000, 5, 1), Name = "Anne", IsSelected = true }); People.Add(new Person() { Dob = new DateTime(2000, 5, 23), Name = "Bob", IsSelected = true }); People.Add(new Person() { Dob = new DateTime(1999, 1, 15), Name = "Kate", IsSelected = false }); // Obviously, in the real thing, the grouping value would be // databound to a combobox or something. GroupBy grouping = GroupBy.Month; var groups = People .OrderBy(x => x.Dob) .GroupBy(x => /* PROBLEM LINE - Gives compiler error CS0411 */ { switch(grouping) { case GroupBy.Month: return new { x.Dob.Year, x.Dob.Month }; case GroupBy.Year: return new { x.Dob.Year}; default: throw new Exception("No can do"); } }); Console.WriteLine("Grouping is: " + grouping + "\r\n"); foreach(var group in groups) { Console.WriteLine("Group: " + group.Key); foreach(Person p in group) { Console.WriteLine("\t" + p.Name + ", " + p.Dob); } Console.WriteLine(""); } Console.ReadKey(); } } public class Person { public DateTime Dob { get; set; } public string Name { get; set; } public bool IsSelected { get; set; } }
over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

El problema ocurre en su declaración de cambio al devolver tipos anónimos. El compilador no puede inferir el tipo (porque lo genera el compilador para cada proyección separada) y arroja un error como resultado.

Puede solucionar esto fácilmente creando una clase contenedora:

 public class GroupedResult { public int Year { get; set; } public int Month { get; set; } }
 var groups = People .OrderBy(x => x.Dob) .GroupBy(x => /* PROBLEM LINE - Gives compiler error CS0411 */ { switch (grouping) { case GroupBy.Month: return new GroupedResult { Year = x.Dob.Year, Month = x.Dob.Month }; case GroupBy.Year: return new GroupedResult { Year = x.Dob.Year }; default: throw new Exception("No can do"); } });

O asegurándose de que existan las mismas propiedades en ambos tipos anónimos, lo que da como resultado el mismo tipo generado por el compilador:

 var groups = People .OrderBy(x => x.Dob) .GroupBy(x => /* PROBLEM LINE - Gives compiler error CS0411 */ { switch (grouping) { case GroupBy.Month: return new { Year = x.Dob.Year, Month = x.Dob.Month }; case GroupBy.Year: return new { Year = x.Dob.Year, Month = 0 }; default: throw new Exception("No can do"); } });
over 4 years ago · Santiago Trujillo Relatório

0

La solución más simple:

 .GroupBy(x => new { Year = x.Dob.Year, Month = grouping == GroupBy.Month ? x.Dob.Month : 0 };
  • Year es siempre parte de su agrupación.
  • Month será parte de su agrupación solo si la grouping es igual a Month
    • De lo contrario, use una constante << ergo sin agrupación

Sugeriría evitar lanzar una excepción dentro de un delegado de GroupBy .

  • Más bien haga un control preliminar y una salida anticipada.
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda