Подтвердить что ты не робот

Использование .ToDictionary()

У меня есть метод, возвращающий список, назовём его GetSomeStrings().

У меня есть метод расширения в строковом классе, возвращающий количество символов в строке, например. myString.Number('A').

Я хотел бы, в одной строке, захватить словарь. Запись словаря содержит строку и номер выбранного символа в строке.

Собственно, я делаю следующее:

var myDic = GetSomeStrings().ToDictionary(x=>x.Number('A'));

который дает мне словарь <int,string>; Я хотел бы, чтобы ключ был как строка.

После этого я хотел бы заказать словарь по значению int. Можно включить это в предыдущий оператор?

Мне бы очень хотелось избежать перечисления коллекции, чтобы сортировать или создавать словарь из списка, что я действительно делаю без проблем. Благодарим вас за помощь в оптимизации!

4b9b3361

Ответ 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 не повлияет. Удалено снова