Разрешить дублирование ключей с помощью ToDictionary () из запроса LINQ - PullRequest
3 голосов
/ 01 марта 2011

Мне нужен материал Key / Value из словаря. Что мне не нужно, так это то, что он не позволяет дублировать ключи.

Regex template = new Regex(@"\{(?<key>.+?)\}(?<value>[^{}]*)");
IDictionary<string, string> dictionary = template.Matches(MyString)
                                             .Cast<Match>()
                                             .ToDictionary(x => x.Groups["key"].Value, x => x.Groups["value"].Value);

Как вернуть словарь, разрешающий дубликаты ключей?

1 Ответ

7 голосов
/ 01 марта 2011

Используйте Lookup class:

Regex template = new Regex(@"\{(?<key>.+?)\}(?<value>[^{}]*)");
ILookup<string, string> dictionary = template.Matches(MyString)
    .Cast<Match>()
    .ToLookup(x => x.Groups["key"].Value, x => x.Groups["value"].Value);

EDIT: Если вы ожидаете получить «простой» набор результатов (например, {key1, value1}, {key1, value2}, {key2, value2} вместо {key1, {value1, value2} }, {key2, {value2} }) вы можете получить результат типа IEnumerable<KeyValuePair<string, string>>:

Regex template = new Regex(@"\{(?<key>.+?)\}(?<value>[^{}]*)");
ILookup<string, string> dictionary = template.Matches(MyString)
    .Cast<Match>()
    .Select(x =>
        new KeyValuePair<string, string>(
            x.Groups["key"].Value,
            x.Groups["value"].Value
        )
    );
...