-3
votes

comparer deux listes à l'exclusion d'une colonne particulière en C #

Considérez une entité nommée employée contenant une pièce d'identité, de l'âge et du nom comme propriétés

J'ai deux listes contenant les détails de l'employé

Je dois comparer les deux listes à l'exclusion de la colonne ID

Aide avec vos suggestions


9 commentaires

Quelle sortie attendez-vous de la comparaison? Pouvez-vous l'expliquer avec quelques points de données?


Pour obtenir de l'aide, je vous conseille de montrer au moins certains efforts pour trouver une solution par vous-même.


Il y a des dizaines de façons que vous pouvez faire cela. Vous pouvez faire boucle sur les deux listes, utiliser Linq, sauf, utilisez HASHSETS, utilisez un comparateur personnalisé. Avez-vous essayé quelque chose? Avez-vous rencontré un problème?


Sans aucun autre témoignage indiquant où vous êtes coincé, nous ne pouvons pas vous aider.


@ChetanRanPariya Je dois comparer uniquement des colonnes sélectionnées dans deux listes et vérifier les doublons


Vous devriez mentionner cela dans la question. Quel code vous avez écrit pour cela? Quel problème vous faites face à cela?


Qu'attendez-vous de sortir de cette comparaison? Différentes techniques conviennent mieux à différents problèmes. Les hashèsets par exemple peuvent produire l'intersection ou la différence très rapidement mais pas les deux.


Vous devez utiliser intersect méthode LINQ avec IequalityComparer. Lire ici


@HARIKRISHNAN et vérifier les doublons ajoutez cela à la question elle-même. C'est important car certaines techniques sont meilleures pour cela que d'autres. Et publier ce que vous avez déjà essayé.


3 Réponses :


2
votes

Cela donnera toutes les entrées identiques dans les deux listes, ignorant la propriété ID de votre employé:

var employees1 = new List<Employee>
{
    new Employee(1, "Thomas", 12),
    new Employee(2, "Alex", 24),
    new Employee(3, "Tobias", 13),
    new Employee(4, "Joshua", 12),
    new Employee(5, "Thomas", 24)
};

var employees2 = new List<Employee>
{
    new Employee(1, "Thomas", 12),
    new Employee(2, "Yu", 24),
    new Employee(3, "Max", 13),
    new Employee(4, "Joshua", 30),
    new Employee(5, "Maico", 13)
};

var duplicates = employees1.Intersect(employees2, new EmployeeComparer());



class EmployeeComparer : IEqualityComparer<Employee>
{
    public bool Equals(Employee employee1, Employee employee2)
    {
        if (Object.ReferenceEquals(employee1, null) || Object.ReferenceEquals(employee2, null) ||
            Object.ReferenceEquals(employee1, employee2)) return false;

        return employee1.Name == employee2.Name && employee1.Age == employee2.Age;
    }

    public int GetHashCode(Employee employee)
    {
        return 0;
    }
}

class Employee
{
    public Employee(int id, string name, int age)
    {
        Id = id;
        Name = name;
        Age = age;
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}


2 commentaires

Vous n'avez pas besoin d'utiliser la réflexion. Employee est le type connu dans est égal à la méthode et que les propriétés sont également connues. Il suffit donc de comparer d'autres propriétés que ID directement serait plus simple que de passer à travers la réflexion.


@Chetanranpariya tu as raison. J'ai mis à jour ma réponse. Je pensais simplement que l'utilisation de la réflexion serait meilleure, si OP décide de toujours ajouter plus de propriétés à sa classe d'employé, il n'est donc pas nécessaire de mettre à jour l'équité à chaque fois.



0
votes

Comme le message est étiqueté avec Linq, j'ai utilisé cela dans ma réponse.

public class Person
{
  private int id;
  private string fName;
  private string addre;

  public string Addre
  {
     get { return addre; }
     set { addre = value; }
  }

  public string FName
  {
     get { return fName; }
     set { fName = value; }
  }

  public int ID
  {
     get { return id; }
     set { id = value; }
  }

  public Person(int i, string f, string a)
  {
     ID = i;
     FName = f;
     Addre = a;
  }
 }


0 commentaires

0
votes

Assumer employé classe: xxx

Vous pouvez simplement utiliser intersect : xxx


0 commentaires