es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo detectar si el orden de dos listas ha cambiado y si ha cambiado, entonces mostrar los nuevos miembros agregados o eliminados en C#.

Quiero comparar dos listas que tienen las propiedades Id, Number, Name, por lo que quiero comparar ambas listas.

Por ejemplo, si NewList tiene:

Id  Nombre  Num
1   Prueba  1
2   Prueba2 2

Y Oldlist tiene:

Id  NewList Number
1   Prueba  1

Así que cuando comparo ambas listas, debería mostrar un texto que en NewList se agregó Prueba2 o si se eliminó de la nueva lista, debería mostrar un texto que el elemento fue eliminado en una nueva línea.

Aquí está el código que he intentado:

StringBuilder oldPref = new StringBuilder();
StringBuilder newPref = new StringBuilder();
newList = GetPref(NewInfo).OrderBy(p => p.Number).Where(x => x.Number> 0).ToList();
OldList = GetPref(OldInfo).OrderBy(p => p.Number).Where(x => x.Number> 0).ToList();

foreach (var item in OldList)
{
  oldPref .Append(item.Name + Environment.NewLine);
}
foreach (var item in newList)
{
  newPref .Append(item.Name + Environment.NewLine);
}

if (!String.Equals(oldPref , newPref ))
{
  note.Append("Cambio en el pedido " + Environment.NewLine);
}
note.Append("De " + Environment.NewLine);
note.Append(oldPref);
note.Append("A " + Environment.NewLine);
note.Append(newPref);

¿Alguien puede ayudarme con esto? Como puedo hacerlo correctamente. Gracias de antemano.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para comparar dos listas con las propiedades Id, Number, Name, puede utilizar los métodos Except e Intersect. Aquí hay un ejemplo de fragmento de código:

    var newList = new List<item>
    {
        new Item { Id = 1, Name = "Test", Number = 1 },
        new Item { Id = 2, Name = "Test2", Number = 2 }
    };
    
    var oldList = new List<item>
    {
        new Item { Id = 1, Name = "Test", Number = 1 }
    };
    
    var addedItems = newList.Except(oldList, new ItemComparer());
    var removedItems = oldList.Except(newList, new ItemComparer());
    
    foreach (var item in addedItems)
    {
        Console.WriteLine($"El ítem {item.Name} con Id {item.Id} y Número {item.Number} se ha agregado.");
    }
    
    foreach (var item in removedItems)
    {
        Console.WriteLine($"El ítem {item.Name} con Id {item.Id} y Número {item.Number} se ha eliminado.");
    }
    

    Donde ItemComparer es una clase que implementa IEqualityComparer<item> para comparar los ítems en base a su propiedad de Id:

    public class ItemComparer : IEqualityComparer<item>
    {
        public bool Equals(Item x, Item y)
        {
            if (object.ReferenceEquals(x, y))
                return true;
    
            if (object.ReferenceEquals(x, null) || object.ReferenceEquals(y, null))
                return false;
    
            return x.Id == y.Id;
        }
    
        public int GetHashCode(Item item)
        {
            if (object.ReferenceEquals(item, null))
                return 0;
    
            return item.Id.GetHashCode();
        }
    }
    

    Este código producirá la siguiente salida:

    El ítem Test2 con Id 2 y Número 2 se ha agregado.
    

    Puede modificar este código para que se adapte a sus requerimientos específicos.

Comments are closed.