LinqToObjectiveC–Linq风格的查询API

/ 0评 / 0

这两天在优化一些数据的分类和排序,之前写的方法感觉很慢,偶然看到了LinqToObjectiveC这个库,发现很好用,就拿来直接使用了,这里简单介绍一下使用方法
使用pod安装,Podfile添加

pod 'LinqToObjectiveC'

先看一下我这里使用的

//根据某个参数分类
NSDictionary *resultDic = [fileArray linq_groupBy:^id(FileModel *item) {
    return item.news_fileTime;
}];
    
//倒序排序
NSArray *keyArray = [[resultDic allKeys] linq_sortDescending];

下面看一下官方的例子

NSArray方法示例

linq_where

- (NSArray*) linq_where:(LINQCondition)predicate;

基于谓词筛选值的序列。
下面的示例使用where方法查找为 25的人员:

NSArray* peopleWhoAre25 = [input linq_where:^BOOL(id person) {
 return [[person age] isEqualToNumber:@25];
}];

linq_select

- (NSArray*) linq_select:(LINQSelector)transform;

将序列中的每个元素投影到新表中. array 中的每个元素都由'选择器'转换成新的表单,然后用于填充输出 array 。

下面的示例使用返回每个 Person 实例的NAME的选择器。 输出将是 NSString 实例的array 。

NSArray* names = [input linq_select:^id(id person) {
 return [person name];
}];

linq_selectAndStopOnNil

- (NSArray*)linq_selectAndStopOnNil:(LINQSelector)transform;

将序列中的每个元素投影到新表中. 如果转换为任何元素返回零,投影将失败并返回零。

linq_sort

- (NSArray*) linq_sort;
- (NSArray*) linq_sort:(LINQSelector)keySelector;
- (NSArray*) linq_sortDescending;
- (NSArray*) linq_sortDescending:(LINQSelector)keySelector;

通过'自然'排序顺序或者通过 keySelector 对 array的元素进行排序。

下面是一个自然排序的示例,下面是 NSNumber 实例的集合:

NSArray* input = @[@21, @34, @25];NSArray* sortedInput = [input linq_sort]; // 21, 25, 34

你可以使用密钥选择器来对 array 实例的进行排序:

NSArray* sortedByName = [input linq_sort:^id(id person) {
 return [person name];
}];

伴随的'降序'方法只是反转排序顺序:

NSArray* input = @[@21, @34, @25];NSArray* sortedInput = [input linq_sort]; // 21, 25, 34NSArray* sortedInput = [input linq_sortDescending]; // 34, 25, 21

linq_sum

- (NSNumber *)linq_sum;

对 array 中的元素求和。

linq_ofType

- (NSArray*) linq_ofType:(Class)type;

根据指定类型筛选 array的元素。

在以下示例中,筛选了 NSString 和 NSNumber 实例的混合 array,以只返回 NSString 实例:

NSArray* mixed = @[@"foo", @25, @"bar", @33];NSArray* strings = [mixed linq_ofType:[NSStringclass]];

linq_selectMany

- (NSArray*) linq_selectMany:(LINQSelector)transform;

将序列中的每个元素投影到 NSArray,并将结果序列展平为一个序列。

这是一个有趣的 ! 这类似于 select 方法,但是选择器必须返回 NSArray,选择多个操作将返回的数组拼合成单个序列。

下面是一个简单的例子:

NSArray* data = @[@"foo, bar", @"fubar"];NSArray* components = [data linq_selectMany:^id(id string) {
 return [string componentsSeparatedByString:@", "];
}];

一个更有用的例子可以能使用选择许多来返回订单 array的所有订单行。

linq_distinct

- (NSArray*) linq_distinct;
- (NSArray*) linq_distinct:(LINQSelector)keySelector;

返回序列中的不同元素。 这只需要一个项的array,返回不同( 例如 )的array 。 唯一) 源顺序中的值。

这里方法的no-arg使用默认的比较给定对象的方法。 使用键选择器的版本允许你指定每个项的相等性所使用的值。

下面是一个示例,它从字符串的一个 array 返回不同的值:

NSArray* names = @[@"bill", @"bob", @"bob", @"brian", @"bob"];NSArray* distinctNames = [names linq_distinct];// returns bill, bob and brian

下面是一个更复杂的示例,它使用密钥选择器来查找具有不同年龄的人员实例:

NSArray* peopleWithUniqueAges = [input linq_distinct:^id(id person) {
 return [person age];
}];

linq_aggregate

- (id) linq_aggregate:(LINQAccumulator)accumulator;

对序列应用累加器函数. 这里方法通过将累加器函数应用于每个连续元素,将 array 转换为单个值。

下面是一个从字符串的array 创建逗号分隔列表的示例:

NSArray* names = @[@"bill", @"bob", @"brian"];id aggregate = [names linq_aggregate:^id(id item, id aggregate) {
 return [NSStringstringWithFormat:@"%@, %@", aggregate, item];
}];// returns"bill, bob, brian"

下面是另一个示例,它从一个数字的array 返回最大值:

NSArray* numbers = @[@22, @45, @33];id biggestNumber = [numbers linq_aggregate:^id(id item, id aggregate) {
 return [item compare:aggregate] == NSOrderedDescending? item : aggregate;
}];// returns 45 

linq_firstOrNil

- (id) linq_firstOrNil;
- (id) linq_firstOrNil:(LINQCondition)predicate;

返回 array的第一个元素,如果 array 为空,则返回 nil 。

linq_lastOrNil

- (id) linq_lastOrNil;

返回 array的最后一个元素,如果 array 为空,则返回 nil

linq_skip

- (NSArray*) linq_skip:(NSUInteger)count;

返回跳过源 array的第一个'n'元素的array,包括 rest 。

linq_take

- (NSArray*) linq_take:(NSUInteger)count;

返回包含源 array的第一个'n'元素的array 。

linq_any

- (BOOL) linq_any:(LINQCondition)condition;

测试 array 中的任何项是否传递给定条件。

例如你可以检查 array 中的任何数字是否等于 25:

NSArray* input = @[@25, @44, @36];BOOL isAnyEqual = [input linq_any:^BOOL(id item) {
 return [item isEqualToNumber:@25];
 }];// returns YES

linq_all

- (BOOL) linq_all:(LINQCondition)condition;

测试 array 中的所有项是否都传递给给定的条件。

例如你可以检查 array 中的所有数字是否等于 25:

NSArray* input = @[@25, @44, @36];BOOL areAllEqual = [input linq_all:^BOOL(id item) {
 return [item isEqualToNumber:@25];
 }];// returns NO

linq_groupBy

- (NSDictionary*) linq_groupBy:(LINQSelector)groupKeySelector;

将 array 中的项分组返回字典。 将 groupKeySelector 应用于 array 中的每个元素,以确定它属于哪个组。

返回的字典将组值( 由密钥选择器返回) 作为键,每个值包含一个 NSArray,包含该组中的所有项。

例如,如果你想按它的第一个字母分组许多字符串,可以以执行以下操作:

NSArray* input = @[@"James", @"Jim", @"Bob"];NSDictionary* groupedByFirstLetter = [input linq_groupBy:^id(id name) {
 return [name substringToIndex:1];
}];// the returned dictionary is as follows:// {// J = ("James","Jim");// B = ("Bob");// }

linq_toDictionary

- (NSDictionary*) linq_toDictionaryWithKeySelector:(LINQSelector)keySelector;
- (NSDictionary*) linq_toDictionaryWithKeySelector:(LINQSelector)keySelector valueSelector:(LINQSelector)valueSelector;

通过将给定的keySelector和( 可选) valueSelector应用到 array 中的每个项,将源 array 转换为字典。 如果你使用 toDictionaryWithKeySelector: 方法,或者 toDictionaryWithKeySelector:valueSelector: 使用 nil valueSelector的方法,每个字典项的值只是来自源 array的项。

例如,下面的代码采用名称 array,创建一个字典,它的中键是每个 NAME的第一个字母,值为 NAME ( 在较低的情况下) 。

NSArray* input = @[@"Frank", @"Jim", @"Bob"];NSDictionary* dictionary = [input linq_toDictionaryWithKeySelector:^id(id item) {
  return [item substringToIndex:1];
} valueSelector:^id(id item) {
  return [item lowercaseString];
}];// result:// (// F = frank;// J = jim;// B = bob;// )

而在下面没有值选择器,因此源 array 中的字符串直接使用。

NSArray* input = @[@"Frank", @"Jim", @"Bob"];NSDictionary* dictionary = [input linq_toDictionaryWithKeySelector:^id(id item) {
 return [item substringToIndex:1];
}];// result:// (// F = Frank;// J = Jim;// B = Bob;// )

linq_count

- (NSUInteger) linq_count:(LINQCondition)condition;

计算 array 中传递给定条件的元素数。

例如可以检查有多少数字等于某个值:

NSArray* input = @[@25, @35, @25];NSUInteger numbersEqualTo25 = [input linq_count:^BOOL(id item) {
 return [item isEqualToNumber:@25];
}];// returns 2

linq_concat

- (NSArray*) linq_concat:(NSArray*)array;

返回一个 array,它是concatonating的结果,给定 array 到这里 array的末尾。

linq_reverse

- (NSArray*) linq_reverse;

返回与源具有相同元素但顺序相反的array 。

NSDictionary方法示例

本节提供了每个API方法的几个简单示例。

linq_where

- (NSDictionary*) linq_where:(LINQKeyValueCondition)predicate;

根据谓词过滤字典。

下面的示例使用filters字典删除任何等于它的值的键。

NSDictionary* result = [input linq_where:^BOOL(id key, id value) {
 return [key isEqual:value];
}];

linq_select

- (NSDictionary*) linq_select:(LINQKeyValueConditionKeyValueSelector)selector;

将字典中的每个 key-value 对投影到新表单中。 每个 key-value 对都由'选择器'转换成新表单,然后用于填充输出字典的值。

以下示例获取具有字符串值的字典,返回一个新字典,其中每个值都是源字符串的第一个字符。

NSDictionary* result = [input linq_select:^id(id key, id value) {
 return [value substringToIndex:1];
}];

linq_toArray

- (NSArray*) linq_toArray:(LINQKeyValueSelector)selector;

将字典中的每个 key-value 对投影到一个新的窗体中,该窗体用于填充输出 array 。

以下示例获取带有字符串值的字典,返回连接字典中每个项的键和值的array 。

NSDictionary* input = @{@"A" : @"Apple", @"B" : @"Banana", @"C" : @"Carrot"};NSArray* result = [input linq_toArray:^id(id key, id value) {
 return [NSStringstringWithFormat:@"%@, %@", key, value];
}];// result:// (//"A, Apple",//"B, Banana",//"C, Carrot"// )

linq_any

- (BOOL) linq_any:(LINQKeyValueCondition)condition;

测试字典中的任何 key-value 对是否传递给定的条件。

例如你可以检查值是否包含字母'n':

NSDictionary* input = @{@"a" : @"apple", @"b" : @"banana", @"c" : @"bat"};BOOL anyValuesHaveTheLetterN = [input linq_any:^BOOL(id key, id value) {
 return [value rangeOfString:@"n"].length!= 0;
}];// returns YES

linq_all

- (BOOL) linq_all:(LINQKeyValueCondition)condition;

测试字典中的所有 key-value 对是否传递给给定的条件。

例如可以检查所有值是否包含字母'a',或者使用条件的键组件查看每个值是否包含字符串键:

NSDictionary* input = @{@"a" : @"apple", @"b" : @"banana", @"c" : @"bat"};BOOL allValuesHaveTheLetterA = [input linq_all:^BOOL(id key, id value) {
 return [value rangeOfString:@"a"].length!= 0;
}];// returns YESBOOL allValuesContainKey = [input linq_all:^BOOL(id key, id value) {
 return [value rangeOfString:key].length!= 0;
}];// returns NO - the value 'bat' does not contain the letter it is keyed with 'c'

linq_count

- (NSUInteger) linq_count:(LINQKeyValueCondition)condition;

计算满足给定条件的key-value 对的数目。

以下示例计算包含键的字典值的数量:

NSDictionary* input = @{@"a" : @"apple", @"b" : @"banana", @"c" : @"bat"};NSUInteger valuesThatContainKey = [input linq_count:^BOOL(id key, id value) {
 return [value rangeOfString:key].length!= 0;
}];// returns 2 -"bat" does not contain the key"c"

linq_merge

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

将本字典的内容与给定词典合并。 对于任何重复项,将使用源字典中的值。

下面的示例合并了一对字典

NSDictionary* input = @{@"a" : @"apple", @"b" : @"banana", @"c" : @"cat"};NSDictionary* result = [input linq_merge:@{@"d" : @"dog", @"e" : @"elephant"}];// result:// (// a = apple;// b = banana;// c = cat;// d = dog;// e = elephant;// )

评论已关闭。