2009-01-28 10 views
2

J'ai une liste avec plusieurs classes qui contiennent une propriété qui est un entier (Id).Comment puis-je obtenir des données d'une liste avec une clause where à une autre liste?

J'ai aussi une liste d'entiers.

Maintenant, je voudrais couper la liste de mon objet à seulement la classe qui a la propriété dans la liste de l'entier.

Exemple:

List of MyObject 
[MyObjectA].Id = 1 
[MyObjectB].Id = 2 
[MyObjectC].Id = 3 
[MyObjectD].Id = 4 

List of Integer 
1 
2 

Final list should be 
[MyObjectA] 
[MyObjectB] 

Comment puis-je faire?

Répondre

7

Vous pouvez utiliser contient:

var finalList = originalList.Where(x => idList.Contains(x.Id)).ToList(); 

Ou une jointure:

var finalList = (from entry in originalList 
       join id in idList on entry.Id equals id 
       select entry).ToList(); 
+0

avez-vous dire entry.Id au lieu de x.Id? (en cas d'utilisation join) – shahkalpesh

+0

J'aime la solution 1 le meilleur. Les jointures sont sympa, mais j'aime mieux la lisibilité du premier. –

+0

@shahkalpesh: Correction, merci. @ Longhorn213: Le second sera significativement plus rapide si idList finit par être très gros. Il construit essentiellement une carte de hachage au lieu de faire un balayage linéaire pour chaque entrée. –

-1

Que diriez-vous:

list.RemoveAll(x => list2.IndexOf(x.Id) >= 0); 
0

Cela devrait le faire:

// Assume objList is IEnumerable<MyObject> and intList is IEnumerable<int>. 
IEnumerable<MyObject> intersection = 
    from obj in objList 
    join i in intList on obj.Id equals i 
    select obj 

Notez que si plusieurs objets ont le même ID ou si l'ID est répertorié plusieurs fois dans la liste et qu'un objet y correspond, l'objet apparaîtra plusieurs fois dans la liste résultante.

Je pense que le groupe est meilleur pour les listes plus grandes, car certaines des autres solutions parcourent les listes plusieurs fois pour rechercher l'objet correspondant.

0

Ou si vous avez deux listes avec chacune des propriétés, essayez ceci:

List<someObj1> firstList ... //assume this has items 
List<otherObj2> secondList ... //assume this has items 
var finalList = firstList.Where(so1 => secondList.Select(oo2 => oo2.Prop1).Contains(so1.Prop1) && so1.Prop2 == "foo"); 

//Prop1 is a property of the someObj1 and otherObj objects. 
//Prop2 is a property of the someObj1 object. 
Questions connexes