2009-06-15 20 views
7

utilizzando LINQ in Net posso selezionare gli elementi da una matrice che corrispondono a determinati criteri passando da un array chiamato persone:NSMutableArray - Query elementi senza enumerazione?

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

C'è qualcosa di simile che posso fare per un NSMutableArray? Ho molti elementi e enumerarlo con un ciclo è piuttosto costoso.

risposta

7
+0

bello. esattamente quello di cui avevo bisogno \t NSPredicate * pred = [predicato NSPredicateWithFormat: @ "isFired == NO"]; \t NSArray * filtered = [self.arenamap filteredArrayUsingPredicate: pred]; – jdee

+3

Ecco una bella recensione su NSPredicate vs LINQ. http://www.cimgf.com/2008/08/24/cocoa-tutorial-c-linq-or-cocoa-key-paths-and-nspredicate/ – Lounges

+1

Si noti che questo probabilmente non sarà molto più veloce di iterare il loop te stesso. Fondamentalmente per selezionare elementi da una matrice come questa, l'intero array deve essere ripetuto da qualche parte lungo la linea –

0

Un'altra opzione sarebbe quella di utilizzare Higher Order Messaging per implementare la selezione. Ad esempio,

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

Dove greaterIQ sarebbe un metodo di categoria su People.

4

Ho creato una semplice libreria, denominata Linq to ObjectiveC, che è una raccolta di metodi che forniscono un'interfaccia di query in stile Linq. Nel tuo caso è necessario il metodo Linq-to-ObjectiveC where:

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

Ciò restituisce un array di di persone dove loro quoziente d'intelligenza> 110.

+2

Nice - buon consiglio. La mancanza di questi metodi ovvi nelle lezioni della collezione di Cocoa è sbalorditiva. (Inoltre, stranamente, questo non sarebbe stato possibile quando la domanda è stata postata originariamente, poiché i blocchi non erano ancora in giro. – Chuck

0

Naturalmente queste (10.6+) giorni abbiamo API belle come indexOfObjectPassingTest a fare cose come

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