关于C#:使用自定义对象过滤NSArray

Filtering an NSArray with custom objects

本问题已经有最佳答案,请猛点这里访问。

我有一个这样的班级:

1
2
3
@interface MyObject : NSObject
@property (nonatomic, strong) NSString *type;
@end

我正在创建这样的数组:

1
2
3
4
5
6
7
8
9
10
11
12
NSMutableArray *array = [NSMutableArray array];
MyObject *obj = [[MyObject alloc] init];
obj.type = @"test1";
[array addObject:obj];

MyObject *obj2 = [[MyObject alloc] init];
obj2.type = @"test2";
[array addObject:obj2];

MyObject *obj3 = [[MyObject alloc] init];
obj3.type = @"test1";
[array addObject:obj3];

我想过滤数组,使其只包含不同类型的对象,在我的示例中,只包含obj1、obj2并删除obj3。


沿着这些线的一些东西应该可以做到这一点:

1
2
3
4
5
6
7
8
9
10
11
12
NSMutableSet * types = [NSMutableSet setWithCapacity:10];
NSPredicate * filterPredicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {

    if ([types containsObject:[evaluatedObject type]]) {
        return NO;
    }
    else {
        [types addObject:[evaluatedObject type]];
        return YES
    }
}];
NSArray * filteredArray = [detailedError filteredArrayUsingPredicate:filterPredicate];

上面的代码保留每种类型的第一个对象并删除其他对象。


我只需重写hash和isequal即可做到这一点:

1
2
3
4
5
6
7
8
9
10
11
- (BOOL) isEqual:(id)object
{
    if([object isKindOfClass: [self class]])
        return [_type isEqualToString: object];
    return NO;
}

- (NSInteger) hash
{
    return [_type hash];
}

然后从数组创建的集合中获取distinct objects数组:

1
NSArray* filteredArray= [NSSet setWithArray: array].allObjects;