通过单个属性比较NSSets

时间:2010-11-07 01:57:20

标签: objective-c comparison nsset

我正在尝试确定两个NSSets是否“相等”但不是isEqualToSet意义上的。两个集合中的项目是相同的类,但不是同一个对象,甚至是对同一个对象的引用。他们拥有一个相同的属性 - 让我们称之为'name'。

我最好的选择是比较这两组来做一个简单的设置计数测试,然后是一个更复杂的objectsPassingTest:在一个集合中的每个项目上,确保一个具有相同名称的项目在另一个集合中?我希望能够处理这种情况更简单。

3 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,但我需要同时比较多个属性(类用户,属性名称 ID

我通过添加一个返回带有该类所需属性的 NSDictionary 的方法解决了这个问题:

- (NSDictionary *)itemProperties
{
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
    [dict setObject:self.name forKey:@"name"];
    [dict setObject:self.id forKey:@"id"];
    return dict;
}

然后使用valueForKey:作为Kevin Ballard提到:

BOOL userSetsEqual = [[userSet1 valueForKey:@"itemProperties"]
    isEqualToSet:[userSet2 valueForKey:@"itemProperties"]];

...其中userSet1和userSet2是包含用户对象的NSSets。

答案 1 :(得分:2)

您可以在两个集合上调用valueForKey:并比较结果。

if ([[set1 valueForKey:@"name"] isEqualToSet:[set2 valueForKey:@"name"]]) {
    // the sets match your criteria
}

答案 2 :(得分:0)

通过文档查看,似乎没有办法真正处理你的这种特殊情况。您将不得不编写一些自定义代码来处理此问题。就个人而言,我建议使用-sortedArrayUsingDescriptors:,然后比较数组,但这只是我。您也可以通过一组进行枚举,然后使用-filteredSetUsingPredicate:缩小另一组并获取其count

无论您使用哪种方法,都要考虑它可能不会超高效的事实。这可能是不可避免的,但有可能采取比其他方法更好的方法。值得深思。