解决方案:我已将 @BlackRider 的答案标记为正确,因为它是最通用的,特别是对于复杂的比较,但是还有其他非常好的答案和评论。我鼓励任何有相同或类似问题的人查看它们并评估适合您的具体情况的最佳行动方案。
在我的情况下,我实际上没有在实现中使用 BlackRider 的解决方案。在 @JoshCaswell 的评论以及 @voromax 的建议的帮助下,我选择使用我自己的解决方案(请参阅下面的编辑#2)indexesOfObjectsWithOptions:passingTest:
因为在这种情况下我的比较非常简单。
感谢所有回答并提供见解的人。
我正在寻找一种有效的方法来从NSArray
基于该对象的属性(在本例中是唯一标识符)。在 C#.NET 中使用 Linq 我会做类似的事情
MyObject obj = myList.Single(o => o.uuid == myUUID);
我还想知道是否有一种有效的方法来获取与非唯一属性匹配的对象数组。再次,使用 Linq 它看起来像
List<MyObject> objs = myList.Where(o => o.flag == true).ToList();
当然,我可以编写循环来执行此操作,但它们不可重用,而且我对它们的性能表示怀疑。
查找具有唯一 ID 的对象:
-(MyObject*)findObjectWithUUID:(NSString*)searchUUID{
for (MyObject* obj in _myArray){
if([obj.uuid isEqualToString: searchUUID])
return obj;
}
}
查找对象数组:
-(NSArray*)findObjectsWithFlag:(BOOL)f{
NSMutableArray* arr = [NSMutableArray array];
for (MyObject* obj in _myArray){
if(obj.flag == f)
[arr addObject:obj];
}
return arr;
}
- 编辑 -
幸运的是,在第一种情况下,我正在寻找的对象有一个唯一的标识符,而且我知道只会有一个。我想出了一个在我的对象上实现 isEqual 的解决方案,该解决方案将由indexOfObject:
- (BOOL)isEqual:(id)object{
return [self.uuid isEqualToString: ((MyObject*)object).uuid];
}
然后创建一个“假”查找对象并使用它来查找真实的查找对象
MyObject *lookupObject = [[MyObject alloc] init];
lookupObject.uuid = searchUUID;
MyObject *actualObject =
[_myArray objectAtIndex:[_myArray indexOfObject:lookupObject]];
这本质上与我上面发布的 for-in 循环相同,但可能更具可读性且更可重用。当然,这仅适用于查找一个唯一的对象,并不能解决我问题的后半部分。
-- 编辑 2 --
检查Class
并实施hash
正如评论中推荐的那样。
- (BOOL)isEqual:(id)object{
return [object isKindOfClass:[MyObject class]] &&
[self.uuid isEqualToString: ((MyObject*)object).uuid];
}
- (NSUInteger)hash{
return [self.uuid hash];
}