Gid*_*eek 13 objective-c nsmutablearray nsarray
我今天有一个关于Objective-C的问题涉及NSMutableArray.来自.net/c#背景我在处理这些事情时遇到了一些麻烦.
假设我有一个名为"Song"的对象
我的歌有3个属性:
我有一个NSMutableArray或NSArray,它拥有我所有的Song对象.
我将如何尝试"查询"我的阵列以获得仅具有(唯一)艺术家或流派的新阵列.
在.net中你会用DISTINCT子句编写一个简单的LINQ查询,如何在Objective-C中解决这个问题?我猜测谓词,但我很难找到解决方案.
提前致谢.
Luk*_*uke 36
你也可以使用:
NSArray *uniqueArtists = [songs valueForKeyPath:@"@distinctUnionOfObjects.artist"];
NSArray *uniqueGenres = [songs valueForKeyPath:@"@distinctUnionOfObjects.genre"];
Run Code Online (Sandbox Code Playgroud)
同样,如果您需要比较整个对象,您可以创建一个新的只读属性,该属性组合您想要匹配的值(通过哈希或其他方式)动态并比较:
NSArray *array = [songs valueForKeyPath:@"@distinctUnionOfObjects.hash"];
Run Code Online (Sandbox Code Playgroud)
注意:请记住,这将返回指定属性的唯一值,而不是对象本身.所以它将是一个NSString值的数组,而不是Song值.
Chu*_*uck 13
根据"独特艺术家"的含义,有几种不同的解决方案.如果您只想获得所有艺术家并且不希望任何人出现不止一次,那就去做吧[NSSet setWithArray:[songArray valueForKey:@"artist"]].如果你的意思是想要设置所有歌曲的列表,这些歌曲是他们的艺术家唯一的歌曲,你需要首先找到只做一首歌的艺术家,然后找到那些艺术家的歌曲:
NSCountedSet *artistsWithCounts = [NSCountedSet setWithArray:[songArray valueForKey:@"artist"]];
NSMutableSet *uniqueArtists = [NSMutableSet set];
for (id artist in artistsWithCounts)
if ([artistsWithCounts countForObject:artist] == 1])
[uniqueArtists addObject:artist];
NSPredicate *findUniqueArtists = [NSPredicate predicateWithFormat:@"artist IN %@", uniqueArtists];
NSArray *songsWithUniqueArtists = [songArray filteredArrayUsingPredicate:findUniqueArtists];
Run Code Online (Sandbox Code Playgroud)
小智 5
或者像这样:
filterTags = [[NSSet setWithArray:filterTags] allObjects];
Run Code Online (Sandbox Code Playgroud)
filterTags 一开始并不独特,但在手术后变得独一无二.
| 归档时间: |
|
| 查看次数: |
18033 次 |
| 最近记录: |