2009-06-15 6 views
7

LINQ en .Net je peux sélectionner des éléments dans un tableau correspondant à un critère particulier à savoir d'un tableau appelé Personnes:NSMutableArray - Interroge les éléments sans énumération?

var cleverPeople = People.Where(o=>o.IQ>110); 

Y at-il quelque chose de semblable que je peux faire à un NSMutableArray? J'ai beaucoup d'éléments dedans et l'énumérer avec une boucle est assez coûteux en termes de performances.

Répondre

7
+0

belle. exactement ce dont j'avais besoin. \t NSPredicate * pred = [NSPredicate predicateWithFormat: @ "isFired == NON"]; \t NSArray * filtré = [self.arenamap filteredArrayUsingPredicate: pred]; – jdee

+3

Voici une belle description sur NSPredicate vs LINQ. http://www.cimgf.com/2008/08/24/cocoa-tutorial-c-linq-or-cocoa-key-paths-and-nspredicate/ – Lounges

+1

Notez que cela ne sera probablement pas beaucoup plus rapide que d'itérer le boucle toi-même. Fondamentalement, pour sélectionner des éléments d'un tableau comme celui-ci, l'ensemble du tableau doit être itéré sur quelque part le long de la ligne –

0

Une autre option consisterait à utiliser Higher Order Messaging pour implémenter select. Par exemple,

NSArray* cleverPeople = [[People select] greaterIQ:110]; 

Lorsque greaterIQ serait une méthode de catégorie sur People.

4

J'ai créé une bibliothèque simple, appelée Linq to ObjectiveC, qui est une collection de méthodes fournissant une interface de requête de type Linq. Dans votre cas, vous avez besoin de la méthode Linq-to-ObjectiveC where:

NSArray* peopleWhoAreSmart = [people where:^BOOL(id person) { 
    return [[person iq] intValue] > 110; 
}]; 

Ce retourne un tableau de personnes où leur QI> 110.

+2

Nice - bonne astuce. Le manque de ces méthodes évidentes dans les classes de collecte de Cocoa est ahurissant. (Aussi, curieusement, cela n'aurait pas été possible quand la question a été postée, car les blocs n'étaient pas encore là. – Chuck

0

Bien sûr, ces (10.6+) jours nous avons des API belles comme indexOfObjectPassingTest à faire des choses comme

var smartPeople = [People indexesOfObjectsPassingTest:^BOOL(id person, NSUInteger idx, BOOL *stop) 
        { return person.iq > 110; } ]; 
Questions connexes