为 Objective-C 提供了流畅的 LINQ 风格查询接口。
这个项目将 LINQ 标准查询操作符移植到 Objective-C。这是通过为 NSArray
和 NSDictionary
类集合分类来实现的。
这个库可以通过 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
*/
对一个集合中的值执行自定义聚合操作。
- (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"
计算值集合的平均值。
- (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.
计算集合中元素的个数,可选地仅计算满足谓词函数的元素。
- (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.
确定集合中的最大值。
- (id)linq_max;
计算集合中所有对象的指定键参数属性的最大值。
- (id)linq_maxForKey:(NSString *)key;
确定集合中的最小值。
- (id)linq_min;
计算集合中所有对象的指定键参数属性的最小值。
- (id)linq_minForKey:(NSString *)key;
计算集合中值的总和。
- (id)linq_sum;
计算集合中所有对象指定键参数所对应属性的值之和。
- (id)linq_sumForKey:(NSString *)key;
将值元素放入一个 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;
将元素放入一个基于索引键的 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;
根据它们是否能转换为指定的类型,选择值。
- (instancetype)linq_ofType:(Class)klass;
选择键可以转换为指定类型的元素。
- (instancetype)linq_ofTypeKey:(Class)klass;
选择值可以转换为指定类型的元素。
- (instancetype)linq_ofTypeValue:(Class)klass;
基于谓词函数选择值。
- (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;
返回空数组。
+ (instancetype)linq_empty;
创建从到包含整数的数组。
+ (instancetype)linq_from:(NSInteger)from to:(NSInteger)to;
生成一个只包含一个重复值的集合。
+ (instancetype)linq_repeat:(id)element count:(NSInteger)count;
返回一个基于选择器定义的公共属性的组 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"]}
// }
通过将每个元素输入到一个其键是选择器结果,其值是元素的 NSDictionary 中,返回 NSDictionaries 的数组:{ key <- selector(element), value <- element}
- (instancetype)linq_toLookup:(id (^)(id item))block;
帮助过滤 toLookup: 方法的结果。返回具有相同键的 NSDictionaries 数组。
- (instancetype)linq_lookup:(id)key;
跳过集合中指定位置之前的元素。
- (NSArray *)linq_skip:(NSInteger)count;
- (NSDictionary *)linq_skip:(NSInteger)count;
从集合中取出指定位置之前的元素。
- (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;