2012-07-01 25 views
13

que tengo una lista de ObjA y ObjB de la siguiente manera:se cruzan dos listas con diferentes objetos

List<ObjA> List1; 
List<ObjB> List2; 

Tanto ObjA y ObjB tiene un campo común que es usuario y quiero intersectar ellos basados ​​en User.Id.

class ObjA 
{ 
    User user; 
    .... other properties 
} 

class ObjB 
{ 
    User user; 
    .... other properties 
} 

class User 
{ 
    int Id; 
    .... other props 
} 

¿Cómo puedo unir estas dos listas en User.Id con linq?

Como resultado, solo quiero la lista de Usuarios.

Respuesta

30

La idea general es

var commonUsers = list1.Select(a => a.User).Intersect(list2.Select(b => b.User)); 

Sin embargo, por sí mismo, esto supone que implementa UserIEquatable<User>, lo que no parece ser el caso aquí. Por lo tanto, debe agregar esta implementación o usar la sobrecarga Intersect que acepte un IEqualityComparer<User> personalizado.

+0

Y a continuación, utilice 'commonUsers' para filtrar ambas listas. – Oded

+0

@Oded: Eso no parece ser lo que él busca. – Jon

+0

solo quiero usuarios comunes. – DarthVader

2

La forma estándar es utilizar un objeto IEqualityComparer. El predeterminado usa la comparación de igualdad estándar. Cree una clase que implemente la interfaz IEqualityComparer y realice la comparación que desee. A continuación, puede llamar a una sobrecarga de IEnumerable.Intersect que acepte una instancia de su costumbre comparar la clase

7

sin necesidad de IEqualityComparer o IEquatable (que sería mejor de todos modos)

var commonUsers = list1 
        .Select(l1 => l1.User) 
        .Where(u => list1 
         .Select(l => l.User.Id) 
         .Intersect(list2 
          .Select(l2 => l2.Id)) 
         .Contains(u.Id)); 

o

var commonUsers = list1.Select(l1 => l1.User) 
         .Where(u=> list2.Select(l2 => l2.User.Id) 
             .Contains(u.Id)); 
2

1 .busque este simple código

var result = (from objA in objAList 
       join objB in objBList on objA.user.Id equals objB.user.Id 
       select objA/*or objB*/).ToList(); 

2.complete code

class QueryJoin 
{ 
    static void Main(string[] args) 
    { 
     //create users 
     User user1 = new User { Id = 1, Name = "anuo1" }; 
     User user2 = new User { Id = 2, Name = "anuo2" }; 
     User user3 = new User { Id = 3, Name = "anuo3" }; 
     User user4 = new User { Id = 4, Name = "anuo4" }; 
     User user5 = new User { Id = 5, Name = "anuo5" }; 
     //create objAList 
     List<ObjA> objAList = new List<ObjA>(); 
     objAList.Add(new ObjA { user = user1 }); 
     objAList.Add(new ObjA { user = user2 }); 
     objAList.Add(new ObjA { user = user3 }); 
     //create objBList 
     List<ObjB> objBList = new List<ObjB>(); 
     objBList.Add(new ObjB { user = user3 }); 
     objBList.Add(new ObjB { user = user4 }); 
     objBList.Add(new ObjB { user = user5 }); 

     //intersect 
     var result = (from objA in objAList 
         join objB in objBList on objA.user.Id equals objB.user.Id 
         select objA/*or objB*/).ToList(); 

    } 

} 

class ObjA 
{ 
    public User user { get; set; } 
} 

class ObjB 
{ 
    public User user { get; set; } 
} 

class User 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 
Cuestiones relacionadas