Преобразование словаря C # в Objective-C NSDictionary

#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 . Или, при более строгих настройках, вообще не будет компилироваться.