2015-11-27 2 views
2

J'ai une affectation où je dois joindre deux listes du même type (Client). Ils ont des entrées similaires que je dois éviter les répétitions.Joindre deux listes à l'aide de requêtes linq - C#

Ceci est mon client classe:

class Customer 
{ 
    private String _fName, _lName; 
    private int _age, _cusIndex; 
    private float _expenses; 

    public Customer(String fName, String lName, int age, float expenses, int cusIndex) 
    { 
    this._fName = fName; 
    this._lName = lName; 
    this._age = age; 
    this._expenses = expenses; 
    this._cusIndex = cusIndex; 
    } 
} 

J'ai donc deux List<Customer> s nommés customers1 et customers2. Je dois joindre ces deux sans utiliser Collections méthodes (comme customer1.Union(customer2).ToList(); Mais l'utilisation de requêtes LINQ

Voici le requête LINQ je l'ai écrit.

var joined = (from c1 in customers1 
       join c2 in customers2 
       on c1.CusIndex equals c2.CusIndex 
       select new {c1, c2}); 

Mais cela me donne le membre qui apparaissent sur les deux J'ai besoin de tout, sans répétition Existe-t-il une solution ???

+0

1. Remplacer [Equal] (https://msdn.microsoft.com/library/ms173147.aspx) et [GetHashCode] (http://blogs.msdn.com/b/ericlippert/archive/2011/02 /28/guidelines-and-rules-for-gethashcode.aspx) dans votre classe 'Customer' (pour indiquer que deux clients sont considérés égaux, si leur 'CusIndex' est égal). 2. 'join = clients1.Concat (clients2) .Distinct();' – Corak

+1

Il semble qu'il n'y ait pas d'équivalent requête pour la méthode 'Union'. Quelle est la raison de ne pas utiliser la méthode 'Union'? –

+0

@Corak Oui. J'ai déjà fait ça. Mais le problème est, cette requête renvoie les clients qui sont dans les deux listes. Mais j'ai besoin de tout le monde –

Répondre

7

Il semble qu'il n'y ait pas d'équivalent requête pour la méthode Union Vous devrez utiliser cette méthode dans l'appel de la chaîne de méthode ou dans votre requête.

Si vous regardez MSDN documentation le retour de l'union de deux séquences, vous verrez la requête officielle suivante:

var infoQuery = 
    (from cust in db.Customers 
    select cust.Country) 
    .Union 
     (from emp in db.Employees 
     select emp.Country) 
; 

Donc, il n'y a que deux options dans votre cas:

  1. chaîne Méthode:

    var joined = customers1.Union(customers2); 
    
  2. LINQ requête

    var joined = (from c1 in customers1 
           select c1) 
          .Union 
           (from c2 in customers2 
            select c2); 
    
1

Pourquoi ne pas utiliser Distinct pour filtrer les doublons?

var joined = (from c1 in customers1 
      join c2 in customers2 
      on c1.CusIndex equals c2.CusIndex 
      select new {c1, c2}).Distinct(); 

Il y a une belle extension à Microsoft.Ajax.Utilities. Il a une fonction appelée DistinctBy, ce qui peut être plus pertinent dans votre cas.

+0

Je l'ai utilisé. Mais quand j'ai essayé de le convertir dans une nouvelle liste en utilisant la méthode ToList() ', cela me donne Erreur. 'ne peut pas implicitement convertir le type' –

+0

Ceci est similaire à une [auto-jointure] (http://www.tutorialspoint.com/sql/sql-self-joins.htm). ToList() vous donnera une collection anonyme. Je suis confus au sujet de ce que vous essayez d'accomplir. Vous ne pouvez pas convertir un type anonyme en un type connu. –

+0

Comme je l'ai mentionné, j'ai besoin de joindre deux listes sans éléments répétitifs. C'est une partie d'une mission! –