80 votes

Fusionner deux listes d'objets avec linq

Je suis dans la situation suivante

Class Person
{
    string Name
    int Value
    int Change
}

List<Person> list1
List<Person> list2

J'ai besoin de combiner les deux listes en une nouvelle liste. s'il s'agit de la même personne, l'enregistrement combiné aura ce nom, la valeur de la personne dans la liste 2, le changement sera la valeur de la liste 2 - la valeur de la liste 1. Le changement est 0 si aucun doublon

1voto

pungggi Points 509
public void Linq95()
{
    List<Customer> customers = GetCustomerList();
    List<Product> products = GetProductList();

    var customerNames =
        from c in customers
        select c.CompanyName;
    var productNames =
        from p in products
        select p.ProductName;

    var allNames = customerNames.Concat(productNames);

    Console.WriteLine("Customer and product names:");
    foreach (var n in allNames)
    {
        Console.WriteLine(n);
    }
}

0voto

Demir Points 567

Je voudrais suggérer ce lien : http://msdn.microsoft.com/en-us/library/bb513866.aspx . Mon problème était similaire à ce qui a été demandé ici il y a des années et l'exemple dans ce lien l'a résolu.

0voto

Sean Reid Points 356

Le code suivant fonctionne-t-il pour votre problème ? J'ai utilisé un foreach avec un peu de linq à l'intérieur pour combiner les listes et supposer que les personnes sont égales si leurs noms correspondent, et il semble imprimer les valeurs attendues lors de l'exécution. Resharper ne propose aucune suggestion pour convertir le foreach en linq, donc c'est probablement le mieux que je puisse faire de cette façon.

public class Person
{
   public string Name { get; set; }
   public int Value { get; set; }
   public int Change { get; set; }

   public Person(string name, int value)
   {
      Name = name;
      Value = value;
      Change = 0;
   }
}

class Program
{
   static void Main(string[] args)
   {
      List<Person> list1 = new List<Person>
                              {
                                 new Person("a", 1),
                                 new Person("b", 2),
                                 new Person("c", 3),
                                 new Person("d", 4)
                              };
      List<Person> list2 = new List<Person>
                              {
                                 new Person("a", 4),
                                 new Person("b", 5),
                                 new Person("e", 6),
                                 new Person("f", 7)
                              };

      List<Person> list3 = list2.ToList();

      foreach (var person in list1)
      {
         var existingPerson = list3.FirstOrDefault(x => x.Name == person.Name);
         if (existingPerson != null)
         {
            existingPerson.Change = existingPerson.Value - person.Value;
         }
         else
         {
            list3.Add(person);
         }
      }

      foreach (var person in list3)
      {
         Console.WriteLine("{0} {1} {2} ", person.Name,person.Value,person.Change);
      }
      Console.Read();
   }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X