【问题标题】:Distinct Object using NSPredicate使用 NSPredicate 的不同对象
【发布时间】:2012-01-03 09:07:54
【问题描述】:

我有一个自定义对象的 NSArray。考虑自定义对象具有 PageNumber 属性。我想用“customObject.PageNumber is distinct”之类的条件过滤我的 NSArray。

我知道我可以遍历数组并消除具有重复 pageNumbers 的对象。但是有什么简单的方法可以做到吗?我试过了,

[myarray valueForKeyPath:@"distinctUnionOfObjects.pageNumber"];

它给了我唯一的页码(如 7、8、9)。但我想要自定义对象本身,而不仅仅是页码。任何谓词可以帮助我吗?

【问题讨论】:

    标签: objective-c nsarray nspredicate kvc


    【解决方案1】:

    我创建了一个简单的库,称为 Linq to ObjectiveC,它是一组方法,可以让这类问题更容易解决。在您的情况下,您需要 Linq-to-ObjectiveC distinct 方法:

    NSArray* itemsWithUniquePageNumbers = [items distinct:^id(id item) {
        return [item pageNumber];
    }];
    

    这会返回一个对象数组,每个对象都有一个唯一的页码。

    【讨论】:

    • 这很酷。谢谢!
    【解决方案2】:

    是的,这可以在NSPredicate 的帮助下实现

    customObject=[(NSArray*)[myArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self.PageNumber==%d",pageNumber]] lastObject];
    //pageNumber is an integer
    

    过滤后的数组是您的自定义对象的NSArray,它是使用谓词过滤的结果。由于您的页码是唯一的,因此它将仅返回一个对象的数组。我们通过将lastObject 消息传递给它来得到它。

    参考: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Predicates/predicates.html#//apple_ref/doc/uid/TP40001798-SW1

    【讨论】:

    • 对不起。我的问题导致误解。我会更新它。我想要其对象具有唯一页码的数组。
    • @Vignesh 我也面临同样的问题。你有什么解决办法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多