Использование .ToDictionary()
У меня есть метод, возвращающий список, назовём его GetSomeStrings()
.
У меня есть метод расширения в строковом классе, возвращающий количество символов в строке, например. myString.Number('A')
.
Я хотел бы, в одной строке, захватить словарь. Запись словаря содержит строку и номер выбранного символа в строке.
Собственно, я делаю следующее:
var myDic = GetSomeStrings().ToDictionary(x=>x.Number('A'));
который дает мне словарь <int,string>
; Я хотел бы, чтобы ключ был как строка.
После этого я хотел бы заказать словарь по значению int. Можно включить это в предыдущий оператор?
Мне бы очень хотелось избежать перечисления коллекции, чтобы сортировать или создавать словарь из списка, что я действительно делаю без проблем. Благодарим вас за помощь в оптимизации!
Ответы
Ответ 1
редактировать
У ToDictionary()
есть перегрузка, которая принимает два лямбда-выражения (nitpick: Delegates); один для ключа и один для значения.
Например:
var myDic = GetSomeStrings().ToDictionary(x => x, x => x.Number('A'));
Обратите внимание, что значения, возвращаемые GetSomeStrings()
должны быть уникальными.
.Net Dictionary<TKey, TValue>
неупорядочен; это не может быть отсортировано вообще.
Вместо этого вы можете сортировать словарь при его использовании, например так:
foreach(KeyValuePair<string, int> kvp in dict.OrderBy(kvp => kvp.Value))
Ответ 2
Обычный диктонарий не сортируется, но вы можете использовать SortedDictonary:
var sortedDict = new SortedDictionary<string, int>(
GetSomeStrings().ToDictionary(x => x, y => y.Number('A')));
Это утверждение должно предоставить вам SortedDictionary, отсортированный по строковому ключу.
Ответ 3
Если я правильно понял вопрос, вот мое решение:
var myDic = GetSomeStrings()
.Select(x => new KeyValuePair<string, int>(x, x.Number('A')))
.ToDictionary(t => t.Key, t => t.Value);
Ответ 4
Чтобы создать словарь, вы можете сделать это:
var strings = new[] { "one", "2", "three", "four", "five", "six", "seven", "eight", "nine", "ten" };
var dictionary = strings.GroupBy(x => x.Length.ToString()).ToDictionary(x => x.Key, x => x);
Обратите внимание на использование "ToString()", чтобы включить длину строки в строку.
Кроме того, сортировка словаря обычно не имеет смысла. Вы можете сортировать элементы в каждой клавише словаря, или вы можете сортировать ключи словаря, когда хотите их пропустить.
var sortedKeys = dictionary.Keys.OrderBy(x => x);
var sortedValues = dictionary["1"].OrderBy(x => x);
Ответ 5
Вам нужно использовать перегрузку ToDictionary, которая выполняет две функции:
var myDic = GetSomeStrings().ToDictionnary(x => x, x => x.Number('A'));
Обе функции берут объект, который вы используете для создания словаря. Первый создает ключ; второй - значение.
Ответ 6
var myDic = GetSomeStrings()
.ToDictionary(x => x, x => x.Number('A'));
Получает словарь по назначению.
Изменить: добавлен порядок. Сначала заказывает строки, затем помещает их в dict, как вам понравилось
Edit2: Slaks прав. OrderBy не повлияет. Удалено снова