LINQ4Obj-C 1.2.0

LINQ4Obj-C 1.2.0

测试已测试
语言语言 Obj-CObjective C
许可协议 MIT
发布最后发布2014年12月

Michal Konturek 维护。



LINQ for Objective-C

为 Objective-C 提供了流畅的 LINQ 风格查询接口。

简介

这个项目将 LINQ 标准查询操作符移植到 Objective-C。这是通过为 NSArrayNSDictionary 类集合分类来实现的。

这个库可以通过 CocoaPods 获取。

许可协议

此项目的源代码在标准 MIT 许可协议下可用。请参阅 许可文件

示例

id people = @[
              [Person createWithName:@"Adam" withAge:23],
              [Person createWithName:@"Alex" withAge:22],
              [Person createWithName:@"Andrew" withAge:28],
              [Person createWithName:@"Anthony" withAge:19],
              [Person createWithName:@"Mark" withAge:30],
              [Person createWithName:@"Matt" withAge:47],
              [Person createWithName:@"Simon" withAge:33],
              [Person createWithName:@"Steve" withAge:55],
              ];

id result = [[[people linq_where:^BOOL(id item) {
    return ([item age] > 21);
}] linq_select:^id(id item) {
    return [item name];
}] linq_groupBy:^id(id item) {
    return [item substringToIndex:1];
}];

for (id key in [result allKeys]) {
    id names = [[result valueForKey:key]
                linq_aggregate:^id(id item, id aggregate) {
                    return [NSString stringWithFormat:@"%@, %@",
                            aggregate, item];
                }];

    NSLog(@"%@ : %@", key, names);
}

/*
 Output:

 A : Adam, Alex, Andrew
 M : Mark, Matt
 S : Simon, Steve
 */

API

聚合操作

Aggregate

对一个集合中的值执行自定义聚合操作。

- (id)linq_aggregate:(id (^)(id item, id aggregate))block;

以下示例创建一个逗号分隔的字符串从字符串数组。

NSArray *input = @[@"M", @"A", @"R", @"K"];
NSString *result = [input linq_aggregate:^id(id item, id aggregate) {
    return [NSString stringWithFormat:@"%@, %@", aggregate, item];
}]; 
// Result is: @"M, A, R, K"

Average

计算值集合的平均值。

- (id)linq_avg;

计算指定键参数的属性的平均值。

- (id)linq_avgForKey:(NSString *)key; 

示例:返回集合中字符串的平均长度。

NSArray *words = @[@"A", @"AB", @"ABC", @"ABCD", @"ABCDE"];
NSNumber *avg_word_length = [words linq_avgForKey:@"length"];
// Result is 3.

Count

计算集合中元素的个数,可选地仅计算满足谓词函数的元素。

- (NSUInteger)linq_count:(BOOL (^)(id item))block;

示例:返回集合中大于等于 8 的元素的数量。

NSArray *numbers = [NSArray linq_from:1 to:10];
NSInteger *count = [numbers linq_count:^BOOL(id item) {
        return ([item compare:@8] != NSOrderedAscending);
    }];
// Count is 3.

Max

确定集合中的最大值。

- (id)linq_max;

计算集合中所有对象的指定键参数属性的最大值。

- (id)linq_maxForKey:(NSString *)key;

Min

确定集合中的最小值。

- (id)linq_min;

计算集合中所有对象的指定键参数属性的最小值。

- (id)linq_minForKey:(NSString *)key;

Sum

计算集合中值的总和。

- (id)linq_sum;

计算集合中所有对象指定键参数所对应属性的值之和。

- (id)linq_sumForKey:(NSString *)key;

转换操作

ToArray

将值元素放入一个 NSArray 中。

- (NSArray *)linq_toArray;

将满足键条件的值元素放入一个 NSArray 中。

- (NSArray *)linq_toArrayWhereKey:(BOOL (^)(id item))block;

将满足值条件的值元素放入一个 NSArray 中。

- (NSArray *)linq_toArrayWhereValue:(BOOL (^)(id item))block;

将满足键和值条件的值元素放入一个 NSArray 中。

- (NSArray *)linq_toArrayWhereKeyValue:(BOOL (^)(id key, id value))block;

ToDictionary

将元素放入一个基于索引键的 NSDictionary。

- (NSDictionary *)linq_toDictionary;

基于键选择器函数将元素放入一个 NSDictionary 中。

- (NSDictionary *)linq_toDictionaryWithKeyBlock:(id (^)(id item))block;

基于键和值选择器函数将元素放入一个 NSDictionary 中。

- (NSDictionary *)linq_toDictionaryWithKeyBlock:(id (^)(id item))keyBlock
                                     valueBlock:(id (^)(id item))valueBlock;

过滤操作

OfType

根据它们是否能转换为指定的类型,选择值。

- (instancetype)linq_ofType:(Class)klass;

选择键可以转换为指定类型的元素。

- (instancetype)linq_ofTypeKey:(Class)klass;

选择值可以转换为指定类型的元素。

- (instancetype)linq_ofTypeValue:(Class)klass;

Where

基于谓词函数选择值。

- (instancetype)linq_where:(BOOL (^)(id item))block;

选择满足键值条件的值。

- (instancetype)linq_where:(BOOL (^)(id key, id value))block;

选择键满足条件的值。

- (instancetype)linq_whereKey:(BOOL (^)(id item))block;

选择满足条件的值。

- (instancetype)linq_whereValue:(BOOL (^)(id item))block;

生成操作

Empty

返回空数组。

+ (instancetype)linq_empty;

From:To

创建从到包含整数的数组。

+ (instancetype)linq_from:(NSInteger)from to:(NSInteger)to;

Repeat

生成一个只包含一个重复值的集合。

+ (instancetype)linq_repeat:(id)element count:(NSInteger)count;

分组操作

GroupBy

返回一个基于选择器定义的公共属性的组 NSDictionary。每个组定义为字典条目,其键是选择器的结果,其值是返回相同键的所有元素的数组,即 selector(element) -> key。

{ key <- selector(element), value <- [element : key = selector(element)] }

- (NSDictionary *)linq_groupBy:(id (^)(id item))block;

示例

NSArray *words = @[@"Adam", @"Anthony",
                    @"Ben", @"Bob",
                    @"Michael", @"Max", @"Matt",
                    @"Simon"];
NSDictionary *results = [self.input_words linq_groupBy:^id(id item) {
    return [item substringToIndex:1];
}];
// Result is:
// {
//      {"A" : @[@"Adam", @"Anthony"]},
//      {"B" : @[@"Ben", @"Bob"]},
//      {"M" : @[@"Michael", @"Max", @"Matt"]}
//      {"S" : @[@"Simon"]}
// }

ToLookup

通过将每个元素输入到一个其键是选择器结果,其值是元素的 NSDictionary 中,返回 NSDictionaries 的数组:{ key <- selector(element), value <- element}

- (instancetype)linq_toLookup:(id (^)(id item))block;

Lookup

帮助过滤 toLookup: 方法的结果。返回具有相同键的 NSDictionaries 数组。

- (instancetype)linq_lookup:(id)key;

分区操作

Skip

跳过集合中指定位置之前的元素。

- (NSArray *)linq_skip:(NSInteger)count;
- (NSDictionary *)linq_skip:(NSInteger)count;

Take

从集合中取出指定位置之前的元素。

- (NSArray *)linq_take:(NSInteger)count;
- (NSDictionary *)linq_take:(NSInteger)count;

投影操作

选择

基于转换函数的项目值。

- (instancetype)linq_select:(id (^)(id item))block;

以下示例将10添加到集合中的每个元素。

NSArray *result = [[NSArray linq_from:1 to:5] linq_select:^id(id item) {
    return [NSNumber numberWithInteger:([item integerValue] + 10)];
}];
// result is @[@11, @12, @13, @14, @15];

选择多个

基于转换函数的项目值序列,并将其扁平化为一个序列。

- (instancetype)linq_selectMany:(id (^)(id item))block;

此示例返回集合中每个字符串的单词。

NSArray *input = @[@"an apple a day", @"the quick brown fox"];
NSArray *result = [input linq_selectMany:^id(id item) { 
    return [item componentsSeparatedByString:@" "]; 
}]; 
// result is @[@"an", @"apple", @"a", @"day", 
//          @"the", @"quick", @"brown", @"fox"]
//

量词操作

全部

确定序列中的所有元素是否都满足条件。

- (BOOL)linq_all:(BOOL (^)(id item))block;
- (BOOL)linq_all:(BOOL (^)(id key, id value))block;

任何

确定序列中的任何元素是否都满足条件。

- (BOOL)linq_any:(BOOL (^)(id item))block;
- (BOOL)linq_any:(BOOL (^)(id key, id value))block;

集合操作

去重

从集合中删除重复值。

- (instancetype)linq_distinct;

除了...

返回除第二个集合中出现的元素之外的所有集合。

- (instancetype)linq_except:(NSArray *)other;
- (instancetype)linq_except:(NSDictionary *)other;

返回集合交集,即两个集合中共同出现的元素。

- (instancetype)linq_intersect:(NSArray *)other;
- (instancetype)linq_intersect:(NSDictionary *)other;

返回集合并集,即两个集合中出现的唯一元素。

- (NSArray *)linq_union:(NSArray *)other;

通过返回两个字典中键的唯一元素的集合联合来合并字典。

- (NSDictionary *)linq_merge:(NSDictionary *)other;

排序操作

按顺序排序

按升序排序值。

- (instancetype)linq_orderByAscending;

按降序排序值。

- (instancetype)linq_orderByDescending;

根据元素的键对集合的元素进行排序。

- (instancetype)linq_orderByKey:(NSString *)key ascending:(BOOL)ascending;

反转

反转集合中元素的位置。

- (instancetype)linq_reverse;