LINQ преобразовывают словарь в поиск

Если я понял Вас правильно, Вы не хотите указывать значения по умолчанию дважды (однажды, поскольку "DefaultValue" вводит Ваш файл Settings.bundle/Root.plist, и однажды в Вашем коде инициализации приложения), таким образом, Вы не должны сохранять их в синхронизации.

, Так как Settings.bundle хранится в самом комплекте приложений, можно просто считать значения по умолчанию, данные там. Я соединил некоторый пример кода, который смотрит на пакет Настроек и читает значения по умолчанию для каждого ключа там. Обратите внимание, что это не выписывает ключи по умолчанию; если они не будут существовать, то необходимо будет считать и зарегистрировать их в каждом запуске (не стесняйтесь изменять это). Я только сделал некоторые поверхностные тесты, поэтому удостоверьтесь, что это работает на Вас во всех случаях.

- (void)applicationDidFinishLaunching:(UIApplication *)application {    
    NSString *name = [[NSUserDefaults standardUserDefaults] stringForKey:@"name"];
    NSLog(@"name before is %@", name);

    // Note: this will not work for boolean values as noted by bpapa below.
    // If you use booleans, you should use objectForKey above and check for null
    if(!name) {
        [self registerDefaultsFromSettingsBundle];
        name = [[NSUserDefaults standardUserDefaults] stringForKey:@"name"];
    }
    NSLog(@"name after is %@", name);
}

- (void)registerDefaultsFromSettingsBundle {
    NSString *settingsBundle = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"];
    if(!settingsBundle) {
        NSLog(@"Could not find Settings.bundle");
        return;
    }

    NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:@"Root.plist"]];
    NSArray *preferences = [settings objectForKey:@"PreferenceSpecifiers"];

    NSMutableDictionary *defaultsToRegister = [[NSMutableDictionary alloc] initWithCapacity:[preferences count]];
    for(NSDictionary *prefSpecification in preferences) {
        NSString *key = [prefSpecification objectForKey:@"Key"];
        if(key && [[prefSpecification allKeys] containsObject:@"DefaultValue"]) {
            [defaultsToRegister setObject:[prefSpecification objectForKey:@"DefaultValue"] forKey:key];
        }
    }

    [[NSUserDefaults standardUserDefaults] registerDefaults:defaultsToRegister];
    [defaultsToRegister release];
}
18
задан Quintin Robinson 23 September 2009 в 06:09
поделиться

1 ответ

Как насчет:

var lookup = dictionary.SelectMany(pair => pair.Value,
                                   (pair, Value) => new { pair.Key, Value })
                       .ToLookup(pair => pair.Key, pair => pair.Value);

Это действительно выглядит как небольшая трата времени, когда в словаре уже вся информация сгруппирована соответствующим образом, но я не вижу простого способа обойти это . Конечно, вы можете реализовать ILookup самостоятельно с помощью оболочки вокруг словаря ...

16
ответ дан 30 November 2019 в 07:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: