2010-10-19 7 views
2

J'ai une liste ObservableCollection<myClass>. Il contient 10 objets de type MyClass.ArrayList C# Contient une requête de méthode

class MyClass 
{ 
    string name; 
    int age; 
} 

Si je veux trouver tous les éléments dans la liste où age = 10, puis-je utiliser la méthode Contains? Si oui, comment puis-je faire cela sans utiliser l'itération?

+4

Votre question parle de ObservableCollection, mais votre titre parle de ArrayList. S'il vous plaît modifier pour être cohérent. –

Répondre

6
var age10 = list.Where(i => i.age == 10); 

Beaucoup plus de requêtes ici: http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx

+0

Notez que bien que ce soit une bonne solution, dans les coulisses, il utilise l'itération. Cela ne pose aucun problème pour 10 objets, mais peut être lent s'il est surutilisé sur de plus grandes collections, alors soyez conscient de cela. –

+0

En fait, les itérateurs sont lents dans les cas où le coût en temps de l'itération est plus important que le coût en temps de traitement de chaque valeur dans la boucle, * et * la collection est grande (jusqu'à des centaines). Si c'est le cas cependant, vous voudrez probablement reconsidérer votre choix de structure de données pour commencer: un tableau natif trié, un arbre, ou un dictionnaire de listes serait mieux, car ils seraient O (log N), O (log N) et O (1) pour rechercher respectivement - par opposition à l'O (N) que vous obtenez avec une ObservableCollection non triée. –

5

Non, Contains semble que pour une valeur spécifique, pas quelque chose correspondant à un prédicat. Il trouve également seulement une valeur plutôt que chaque valeur correspondante.

Vous pouvez cependant utiliser Where de LINQ to Objects, supposant que vous êtes sur .NET 3.5 ou supérieur:

foreach (var item in list.Where(x => x.Age == 10)) 
{ 
    // Do something with item 
} 
3

Depuis ObservableCollection<T> outils Collection<T> qui implémente IEnumerable<T> ... vous pouvez utiliser LINQ pour méthodes d'extension de l'objet pour faire ce simple (même si elle utilisera l'itération en arrière-plan):

var results = list.Where(m => m.age == 10); 
0

Vous pouvez utiliser LINQ pour ce faire, mais pas Contains

var foo = from bar in myCollection where bar.age == 10 select bar; 
1

Comme d'autres l'ont indiqué, l'utilisation de .Where(i => i.Age == 10) serait le bon moyen d'obtenir le résultat indiqué dans la question. Vous utiliseriez .Contains() pour vérifier votre collection pour une instance spécifique de votre classe.

Questions connexes