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

489
Visualizações
¿Cómo contar la ocurrencia de cada número en la lista A que existe en la lista B y devolver cero si no existió?

Esta es mi primera pregunta en esta comunidad y me gustaría obtener una respuesta a mi problema. Supongamos que tengo dos listas A y B:

 List<int> listA = new List<int>(); List<int> listB = new List<int>(); listA.Add(1); listA.Add(2); listA.Add(8); listB.Add(1); listB.Add(1); listB.Add(1); listB.Add(2); listB.Add(2); listB.Add(2); listB.Add(2);

Me gustaría contar las ocurrencias de cada elemento en listB que ya existía en listA y agregar cero si no existe:

Esto es lo que he probado:

 var result = listB.GroupBy(x => x).ToDictionary(k => k.Key, v => v.Count()); foreach(var res in result.Values) Console.WriteLine(res); // it will print only {3,4}

El resultado esperado será:

 // { 3,4,0} => 3 is the occurrences number of 1 , 4 is the occurrences number of 2 ,and 0 is the number occurrences of 8

¿Cómo puedo lograr este resultado?

over 4 years ago · Santiago Trujillo
4 Respostas
Responde à pergunta

0

Es un buen problema usar la combinación externa izquierda en LINQ. Aquí hay un artículo al respecto . Es la mejor solución de rendimiento porque itera sobre la colección solo una vez y es importante para colecciones grandes o métodos de uso frecuente.

Aquí hay un ejemplo para su problema:

 var result = from a in listA join b in listB.GroupBy(x => x) on a equals b.Key into gj from subList in gj.DefaultIfEmpty() select new { Number = a, Count = subList?.Count() ?? 0 };

También puede usar GroupJoin y el encadenamiento de métodos, pero creo que es mucho más difícil de leer:

 var result = listA .GroupJoin(listB.GroupBy(x => x), a => a, b => b.Key, (a, gj) => new { a, gj }) .SelectMany(@t => @t.gj.DefaultIfEmpty(), (@t, subList) => new { Number = @ta, Count = subList?.Count() ?? 0 });

Después de ese resultado, contendrá una colección de tipos anónimos con campos Number y Count con 3 elementos: {1, 3}, {2, 4}, {8, 0} .

Actualización de los comentarios (gracias a Caius Jard): si no puede usar el operador condicional nulo, puede reemplazarlo con una verificación explícita: subList == null ? 0 : subList.Count()

over 4 years ago · Santiago Trujillo Relatório

0

Usaría la extensión linq .Count(), que contará la cantidad de elementos que cumplen una condición. Sí, esto iterará la lista más veces de las necesarias, pero no crea ningún objeto innecesario y es muy legible:

 var countOccurences = new List<int>(); foreach (var inA in listA) { countOccurences.Add(listB.Count(inB => inB == inA)); } Console.WriteLine(string.Join(", ", countOccurences));

Una vez que tenga el ciclo funcionando, entonces debería ser fácil ver que se puede hacer en una sola declaración:

 var countOccurences = listA.Select(inA => listB.Count(inB => inA == inB));
over 4 years ago · Santiago Trujillo Relatório

0

arreglando tu código

 var result = listB.GroupBy(x => x).ToDictionary(k => k.Key, v => v.Count()); foreach(var ent in listA) Console.WriteLine(result.ContainsKey(ent)?result[ent]:0);
over 4 years ago · Santiago Trujillo Relatório

0

declaración Linq de una línea

 listA.Select(a => listB.Contains(a) ? a : 0 ).Select(r=>listB.Count(w=> w==r)).ToList();
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