2015-09-09 2 views
0

У меня есть словарь, имеющие два массива, словарь являетсякак оценить NSDictionary в NSPredicate

NSDictionary * StudentDetails = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:StudentIDs,StudentNames, nil] forKeys:[NSArray arrayWithObjects:@"ID",@"NAME", nil]]; 

и два массива является

NSArray * StudentIDs = [NSArray arrayWithObjects:@"07bg1234",@"07ac1234", nil]; 
NSArray * StudentNames = [NSArray arrayWithObjects:@"aaaaaaa",@"bbbbb", nil]; 

и я попытался предикаты для получения значений массива в виде

NSString * searchStr = @"07bg1234"; 

    NSPredicate * fileExtPredicate01 = [NSPredicate predicateWithFormat:@"SELF IN %@", StudentIDs]; 

    if (([fileExtPredicate01 evaluateWithObject: searchStr]== YES)) { 
     NSLog(@"Student ID: %@ Exists",searchStr); 
    } 
    else { 
     NSLog(@"Student ID: %@ not Exists",searchStr); 
    } 

до этого он отлично работает .... когда я попытался получить значения словаря как

NSPredicate * fileExtPredicate02 = [NSPredicate predicateWithFormat:@"SELF IN %@", StudentDetails]; 

    if (([fileExtPredicate02 evaluateWithObject: searchStr]== YES)) { 
     NSLog(@"Student Details: %@ Exists",searchStr); 
    } 
    else { 
     NSLog(@"Student Details: %@ not Exists",searchStr); 
    } 

Я всегда получаю о/р, как Студенческая деталь **** не существует ... Как я могу получить «searchStr» есть или нет в словаре, используя предикаты ???? Спасибо в Advance

ответ

1

Для вашего словаря вам необходимо условие <Item> IN <Key> которое соответствует @"07bg1234" IN @"ID" в вашем примере. Объектом в evaluateWithObject является словарь.

NSPredicate *fileExtPredicate02 = [NSPredicate predicateWithFormat:@"%@ IN ID", searchStr]; 
if ([fileExtPredicate02 evaluateWithObject: studentDetails] == YES) { 
    NSLog(@"Student Details: %@ Exists",searchStr); 
} 
else { 
    NSLog(@"Student Details: %@ not Exists", searchStr); 
}; 
+0

если searchStr это значение в StudentIDs это Ok .. если searchStr это значение в StudentNames он не работает .. В поручении Predicate вы не упоминается словарь ?? достаточно только ключевого значения ???? – Sunil

+0

Конечно, для элементов в 'StudentNames' есть ключ' NAME' – vadian

+0

searchStr может быть либо в ID, либо в NAME. Вышеприведенный код предлагает ограничить searchStr для ID ... У меня есть идея, которая не ограничивает поискStr, но ему нужен еще один предикат. Поскольку словарь содержит n количество массивов, мне нужно создать n число предикатов. . Есть ли другой способ в простом формате – Sunil

2

@"SELF IN %@.ID".

Я строю следующий проходный тест.

NSArray * StudentIDs = [NSArray arrayWithObjects:@"07bg1234",@"07ac1234", nil]; 
NSArray * StudentNames = [NSArray arrayWithObjects:@"aaaaaaa",@"bbbbb", nil]; 
NSDictionary * StudentDetails = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:StudentIDs,StudentNames, nil] forKeys:[NSArray arrayWithObjects:@"ID",@"NAME", nil]]; 
NSString *searchStr = @"07bg1234"; 

NSPredicate * fileExtPredicate02 = [NSPredicate predicateWithFormat:@"SELF IN %@.ID", StudentDetails]; 

XCTAssert([fileExtPredicate02 evaluateWithObject:searchStr]); 

Update

Чтобы получить как идентификатор имя, я использовал.

NSArray * StudentIDs = [NSArray arrayWithObjects:@"07bg1234",@"07ac1234", nil]; 
NSArray * StudentNames = [NSArray arrayWithObjects:@"aaaaaaa",@"bbbbb", nil]; 
NSDictionary * StudentDetails = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:StudentIDs,StudentNames, nil] forKeys:[NSArray arrayWithObjects:@"ID",@"NAME", nil]]; 

NSPredicate * fileExtPredicate02 = [NSPredicate predicateWithFormat:@"SELF IN %@.ID OR SELF IN %@.NAME", StudentDetails, StudentDetails]; 

XCTAssert([fileExtPredicate02 evaluateWithObject:@"07bg1234"]); 
XCTAssert([fileExtPredicate02 evaluateWithObject:@"aaaaaaa"]); 

Это чувствует себя очень запутано для меня, и я думаю, что это лучший ответ, используя SUBQUERY(), но я буду думать о том, что немного больше.


Update 2

Так что, если вы можете мириться с некоторой wonkiness, вот SUBQUERY() версия. Предикат - SUBQUERY(%@, $value, SELF IN $value)[email protected] > 0. SUBQUERY(%@, $value, SELF IN $value) возвращает массив совпадающих значений, а [email protected] > 0 возвращает true, если есть хотя бы 1 совпадение. В отличие от предыдущего образца, я не прохожу StudentDetails. Мне нужно пройти StudentDetails.allValues.

NSArray * StudentIDs = [NSArray arrayWithObjects:@"07bg1234",@"07ac1234", nil]; 
NSArray * StudentNames = [NSArray arrayWithObjects:@"aaaaaaa",@"bbbbb", nil]; 
NSDictionary * StudentDetails = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:StudentIDs,StudentNames, nil] forKeys:[NSArray arrayWithObjects:@"ID",@"NAME", nil]]; 

NSPredicate * fileExtPredicate02 = [NSPredicate predicateWithFormat:@"SUBQUERY(%@, $value, SELF IN $value)[email protected] > 0", StudentDetails.allValues]; 

XCTAssert([fileExtPredicate02 evaluateWithObject:@"07bg1234"]); 
XCTAssert([fileExtPredicate02 evaluateWithObject:@"aaaaaaa"]); 
+0

searchStr может быть либо в ID, либо в NAME. Вышеприведенный код, предлагающий ограничить поиск, searchStr только для проверки идентификатора. Но мне нужно проверить значение во всем словаре – Sunil

+0

@Sunil жаль, что в вашем вопросе не было ясно. Я уточню свой ответ. –

+0

извините за это ..но я упомянул как «Как я могу получить« searchStr »там или нет в словаре, используя предикаты« ..... в том, что я могу изменить searchStr как мое желание как значение ID или значение NAME – Sunil

Смежные вопросы