#c# #iphone #objective-c #dictionary #nsdictionary
#c# #iPhone #objective-c #словарь #nsdictionary
Вопрос:
У меня есть следующий код на C #, который возвращает a Dictionary<string, List<Discount>>
.
static void Main(string[] args)
{
List<Discount> list = new List<Discount>();
list.Add(new Discount { Id = 1, Title = "Adam" });
list.Add(new Discount { Id = 2, Title = "Ben" });
list.Add(new Discount { Id = 3, Title = "Alex" });
list.Add(new Discount { Id = 4, Title = "Daniel" });
list.Add(new Discount { Id = 5, Title = "Ethan" });
list.Add(new Discount { Id = 6, Title = "Howard" });
list.Add(new Discount { Id = 7, Title = "Peter" });
list.Add(new Discount { Id = 8, Title = "Tazz" });
list.Add(new Discount { Id = 9, Title = "Steve" });
list.Add(new Discount { Id = 10, Title = "Lyle" });
Dictionary<string, List<Discount>> dic = new Dictionary<string, List<Discount>>();
foreach (Discount d in list)
{
string range = GetRange(d.Title);
if (dic.ContainsKey(range))
dic[range].Add(d);
else
dic.Add(range, new List<Discount> { d });
}
}
static string GetRange(string s)
{
char c = s.ToLower()[0];
if (c >= 'a' amp;amp; c <= 'd')
return "A - D";
else if (c >= 'e' amp;amp; c <= 'h')
return "E - H";
else if (c >= 'i' amp;amp; c <= 'l')
return "I - L";
else if (c >= 'm' amp;amp; c <= 'p')
return "M - P";
else if (c >= 'q' amp;amp; c <= 't')
return "Q - T";
else if (c >= 'u' amp;amp; c <= 'z')
return "U - Z";
return "";
}
К сожалению, оболочка SOAP, которую я использую, не возвращает Dictionary
значение должным образом, что означает, что теперь мне нужно преобразовать мой код C # в Objective-C.
Вместо возврата a Dictionary
я просто верну все данные из своего веб-сервиса и создам NSDictionary
.
Комментарии:
1. Я ответил на ваш вопрос, как и было задано, но я должен отметить, что ключи в словаре не отсортированы… элементы в массиве также не являются значениями… Конечно, легко получить список отсортированных ключей, используя [[result allKeys] sortedArrayUsingComparator:…] и то же самое для
Discount *
элементов
Ответ №1:
Обратите внимание, следующий код предполагает, что вы работаете с ARC (хотя преобразование его в НЕ-ARC является тривиальным).
Это простое однозначное преобразование того, что у вас есть в C #.
Могут быть лучшие способы попытаться сделать то, что вы хотите… но это то, о чем вы просили, так что поехали…
#import <Foundation/Foundation.h>
#pragma mark -
#pragma mark Discount Class Interface
@interface Discount : NSObject
@property (nonatomic, assign) int identity;
@property (nonatomic, copy) NSString * title;
- (id)initWithTitle:(NSString *)title andId:(int)identity;
@end
#pragma mark -
#pragma mark Discount Class Implementation
@implementation Discount
@synthesize title = _title;
@synthesize identity = _identity;
- (id)initWithTitle:(NSString *)title andId:(int)identity
{
self = [super init];
if (self)
{
self.title = title;
self.identity = identity;
}
return self;
}
@end
#pragma mark -
#pragma mark Program Implementation
static NSString * GetRange(NSString * s);
int main (int argc, const char * argv[])
{
@autoreleasepool {
NSMutableArray * discounts = [NSMutableArray array];
[discounts addObject:[[Discount alloc] initWithTitle:@"Adam" andId:1]];
[discounts addObject:[[Discount alloc] initWithTitle:@"Ben" andId:2]];
[discounts addObject:[[Discount alloc] initWithTitle:@"Alex" andId:3]];
[discounts addObject:[[Discount alloc] initWithTitle:@"Daniel" andId:4]];
[discounts addObject:[[Discount alloc] initWithTitle:@"Ethan" andId:5]];
[discounts addObject:[[Discount alloc] initWithTitle:@"Howard" andId:6]];
[discounts addObject:[[Discount alloc] initWithTitle:@"Peter" andId:7]];
[discounts addObject:[[Discount alloc] initWithTitle:@"Tazz" andId:8]];
[discounts addObject:[[Discount alloc] initWithTitle:@"Steve" andId:9]];
[discounts addObject:[[Discount alloc] initWithTitle:@"Lyle" andId:10]];
NSMutableDictionary * result = [NSMutableDictionary dictionary];
for (int i = 0; i < [discounts count]; i )
{
Discount * d = (Discount *)[discounts objectAtIndex:i];
NSString * range = GetRange(d.title);
NSMutableArray * list = [result valueForKey:range];
if (list == nil)
{
list = [NSMutableArray array];
[result setObject:list forKey:range];
}
[list addObject:d];
}
// Here "result" has what you want.
}
return 0;
}
static NSString * GetRange(NSString * s)
{
unichar c = [[s lowercaseString] characterAtIndex:0];
if (c >= 'a' amp;amp; c <= 'd')
return @"A - D";
else if (c >= 'e' amp;amp; c <= 'h')
return @"E - H";
else if (c >= 'i' amp;amp; c <= 'l')
return @"I - L";
else if (c >= 'm' amp;amp; c <= 'p')
return @"M - P";
else if (c >= 'q' amp;amp; c <= 't')
return @"Q - T";
else if (c >= 'u' amp;amp; c <= 'z')
return @"U - Z";
return @"";
}
Комментарии:
1. Тогда вы, должно быть, внесли некоторые изменения, потому что этот код работает просто отлично. Я сам запустил его в Xcode. Возможно, если вы вставили строку кода, которая выдает ошибку?
2. Похоже, вы забыли прямое объявление метода getRange. Если вы не добавляете прямое объявление (подобное тому, которое у меня есть в примере кода), компилятор предполагает, что метод возвращает значение int . Или, при более строгих настройках, вообще не будет компилироваться.