2009-06-15 25 views
7

Sử dụng LINQ trong Net tôi có thể chọn các mục từ một mảng phù hợp với một tiêu chí đặc biệt ví dụ: từ một mảng gọi dân:NSMutableArray - Truy vấn các mục không liệt kê?

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

Có bất cứ điều gì tương tự như tôi có thể làm gì để một NSMutableArray? Tôi có nhiều mặt hàng trong đó và liệt kê nó với một vòng lặp là hiệu suất khá tốn kém khôn ngoan.

Trả lời

7
+0

đẹp. chính xác những gì tôi cần. \t NSPredicate * pred = [NSPredicate predicateWithFormat: @ "isFired == NO"]; \t NSArray * filters = [self.arenamap filtersArrayUsingPredicate: pred]; – jdee

+3

Đây là một bài viết hay về NSPredicate và LINQ. http://www.cimgf.com/2008/08/24/cocoa-tutorial-c-linq-or-cocoa-key-paths-and-nspredicate/ – Lounges

+1

Lưu ý rằng điều này có thể sẽ không nhanh hơn nhiều so với việc lặp lại tự mình lặp lại. Về cơ bản để chọn các mục từ một mảng như thế này, toàn bộ mảng phải được lặp lại ở đâu đó dọc theo dòng –

0

Một tùy chọn khác sẽ là sử dụng Higher Order Messaging để triển khai lựa chọn. Ví dụ:

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

Trường hợp largeIQ là phương pháp danh mục trên Mọi người.

4

Tôi đã tạo một thư viện đơn giản, được gọi là Linq to ObjectiveC, là tập hợp các phương thức cung cấp giao diện truy vấn kiểu LINQ. Trong trường hợp của bạn, bạn cần Linq-to-ObjectiveC where phương pháp:

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

này trả về một mảng của người nơi IQ của họ> 110.

+2

Nice - mẹo hay. Việc thiếu những phương pháp rõ ràng trong các lớp học thu thập của Cocoa là tâm-boggling. (Ngoài ra, vui vẻ đủ, điều này sẽ không thể có được khi câu hỏi ban đầu được đăng, như các khối không xung quanh được nêu ra. Yay tiến bộ.) – Chuck

0

Tất nhiên này (10.6+) ngày chúng tôi đã có API đẹp như indexOfObjectPassingTest để làm những việc như

var smartPeople = [People indexesOfObjectsPassingTest:^BOOL(id person, NSUInteger idx, BOOL *stop) 
        { return person.iq > 110; } ]; 
Các vấn đề liên quan