2009-06-15 27 views
7

mediante LINQ en .Net puedo seleccionar elementos de una matriz que responden a un criterio particular es decir, a partir de una matriz llamada People:NSMutableArray - ¿Artículos de consulta sin enumeración?

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

¿Hay algo similar que pueda hacer para un NSMutableArray? Tengo muchos elementos y enumerarlos con un bucle es bastante costoso en cuanto al rendimiento.

Respuesta

7
+0

beautiful. exactamente lo que necesitaba \t NSPredicate * pred = [NSPredicate predicateWithFormat: @ "isFired == NO"]; \t NSArray * filtered = [self.arenamap filteredArrayUsingPredicate: pred]; – jdee

+3

Aquí hay un bonito artículo sobre NSPredicate vs LINQ. http://www.cimgf.com/2008/08/24/cocoa-tutorial-c-linq-or-cocoa-key-paths-and-nspredicate/ – Lounges

+1

Tenga en cuenta que esto probablemente no sea mucho más rápido que repetir el bucle usted mismo. Fundamentalmente para seleccionar elementos de una matriz como esta, la matriz completa debe repetirse en algún lugar a lo largo de la línea –

0

Otra opción sería usar Higher Order Messaging para implementar seleccionar. Por ejemplo,

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

Donde greaterIQ sería un método de categoría en Personas.

4

He creado una biblioteca simple, llamada Linq to ObjectiveC, que es una colección de métodos que proporcionan una interfaz de consulta de estilo Linq. En el caso de que necesite la Linq-to-ObjectiveC where método:

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

Esto devuelve una matriz de las personas, donde su coeficiente intelectual> 110.

+2

Bueno - buen consejo. La falta de estos métodos obvios en las clases de colección de Cocoa es alucinante. (Además, por extraño que parezca, esto no hubiera sido posible cuando la pregunta se publicó originalmente, ya que aún no había bloques disponibles. Yay progress). – Chuck

0

Por supuesto, estos (10.6+) días tenemos API agradables como a indexOfObjectPassingTest hacer cosas como

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