Cómo obtener duplicados por atributo con LINQ

Tengo mi clase HomeTeam

public class HomeTeam 
{
    public ID { get; set; }
    public string codeTeam { get; set; }
    public string codeNumber { get;set; }
}

Tengo mi lista de objetos:

var listaFiltrada = new List();

Quiero conseguir todos los artículos que tienen el mismo codeTeam y codeNumber parámetros.

Sample:

ID     CodeTeam   CodeNumber
 1      B538       B2235
ID     CodeTeam   CodeNumber
 2      B538       B2235
ID     CodeTeam   CodeNumber
 3      B333       B235

Quiero volver lista de filtros Artículo con ID 1 y 2.

Pregunta hecha hace 3 años, 4 meses, 27 días - Por bytebarricade


4 Respuestas:

  • Supongo que las dos expresiones linq podrían combinarse en una pero creo que esto funciona

                var teams = new List()
                {
                    new HomeTeam() {ID = 1, codeTeam = "B538", codeNumber = "B2235"},
                    new HomeTeam() {ID = 2, codeTeam = "B538", codeNumber = "B2235"},
                    new HomeTeam() {ID = 3, codeTeam = "B333", codeNumber = "B235"},
                    new HomeTeam() {ID = 4, codeTeam = "B333", codeNumber = "B235"},
                    new HomeTeam() {ID = 5, codeTeam = "B333", codeNumber = "B235"},
                    new HomeTeam() {ID = 6, codeTeam = "B333", codeNumber = "B235333"},
                    new HomeTeam() {ID = 7, codeTeam = "B3444433", codeNumber = "B23534433"}
    
                };
    
                var groupedData =
                    (from t in teams
                        group t by new {t.codeTeam, t.codeNumber}
                        into grp
                        where grp.Count() > 1
                        select new
                        {
                            grp.Key.codeTeam,
                            grp.Key.codeNumber,
                            Count = grp.Count()
                        }).ToList();
    
                var ids = from team in teams
                    join grp in groupedData on new {team.codeNumber, team.codeTeam} equals new
                        {grp.codeNumber, grp.codeTeam}
                    select new
                    {
                        ID = team.ID
                    };
    
                foreach (var id in ids)
                {
                    Console.WriteLine(id.ID);
                }
    

    Respondida el Dec 20, 2020 a las 21:29 - por progprophet

    Votos positivos: 0 | Votos negativos: 0

  • esto devuelve una lista con listas de elementos duplicados

    var dups = listaFiltrada.Select(list => new HomeTeam()
            {
                ID = list.ID,
                CodeTeam = list.CodeTeam,
                CodeNumber = list.CodeNumber
            }).GroupBy(x => new { x.CodeNumber, x.CodeTeam })
            .Where(x => x.Count() > 1).ToArray();
    

    Respondida el Dec 20, 2020 a las 21:34 - por codecatalyst

    Votos positivos: 0 | Votos negativos: 0

  • Para obtener los duplicados por atributo en una lista de objetos utilizando LINQ en C

    , puedes hacer lo siguiente:

    • Utiliza el método `GroupBy()` de LINQ para agrupar los objetos por los atributos `codeTeam` y `codeNumber`.
    • Luego, filtra los grupos que tengan más de un elemento, indicando que son duplicados.
    • Finalmente, obtén los objetos duplicados de cada grupo y agrégalos a una nueva lista.

    Aquí tienes un ejemplo de cómo hacerlo:

    csharp
    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    public class HomeTeam
    {
        public int ID { get; set; }
        public string codeTeam { get; set; }
        public string codeNumber { get; set; }
    }
    
    class Program
    {
        static void Main()
        {
            List listaFiltrada = new List
            {
                new HomeTeam { ID = 1, codeTeam = "B538", codeNumber = "B2235" },
                new HomeTeam { ID = 2, codeTeam = "B538", codeNumber = "B2235" },
                new HomeTeam { ID = 3, codeTeam = "B333", codeNumber = "B235" }
            };
    
            var duplicados = listaFiltrada
                .GroupBy(x => new { x.codeTeam, x.codeNumber })
                .Where(g => g.Count() > 1)
                .SelectMany(g => g.Select(x => x))
                .ToList();
    
            foreach (var item in duplicados)
            {
                Console.WriteLine("ID: {0}, CodeTeam: {1}, CodeNumber: {2}", item.ID, item.codeTeam, item.codeNumber);
            }
        }
    }
    

    En este código, la variable duplicados contendrá los objetos duplicados por los atributos codeTeam y codeNumber. Luego, se imprime en consola la información de los objetos duplicados encontrados.

    Respondida el Dec 21, 2020 a las 21:30 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para obtener duplicados por atributos codeTeam y codeNumber usando LINQ, puedes utilizar el siguiente código:

    
    var listaFiltrada = listaHomeTeam
        .GroupBy(x => new { x.codeTeam, x.codeNumber })
        .Where(g => g.Count() > 1)
        .SelectMany(g => g)
        .ToList();
    

    Este código agrupa los elementos de listaHomeTeam por los atributos codeTeam y codeNumber. Luego, filtra los grupos que tienen más de un elemento (es decir, los duplicados). Finalmente, selecciona todos los elementos de los grupos filtrados, dándote una lista de elementos duplicados.

    En tu ejemplo, la lista listaFiltrada contendrá los elementos con ID 1 y ID 2, ya que tienen los mismos valores codeTeam y codeNumber (B538 y B2235).

    Respondida el Dec 21, 2020 a las 21:42 - por Gemini

    Votos positivos: 0 | Votos negativos: 0