LINQ группы по нескольким атрибутам и создать словарь - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть список объектов из класса ScrewBoltPattern.

Я хочу создать словарь, который будет содержать количество появлений каждого семейства ScrewBoltPattern.Чтобы решить, принадлежит ли винт к семейству, я использую некоторые свойства этого класса.

Чтобы упростить этот запрос, скажем, я использую свойства Длина и Диаметр.

Я хочу создать словарь, которыйимеет ключи, отформатированные как винт* Мне нужно где-то задать формат для словарного ключа, но я не знаю, как это сделать.

Ответы [ 4 ]

0 голосов
/ 05 февраля 2019

Возможно, вы не знаете об этом решении, вам может вообще не понадобиться форматирование строк.(вы можете использовать C # 7 со значениями кортежей)

Dictionary<(int length, int diameter), int> boltFamilyList = selectedBolts
    .GroupBy(bolt => (bolt.Length, bolt.Diameter))
    .ToDictionary(bolt => bolt.Key, bolt => bolt.Count());

И доступ как

dic.TryGetValue((10, 20), out int count);

Где 10 и 20 - длина и диаметр

0 голосов
/ 05 февраля 2019

Вы также можете использовать ILookup для достижения той же цели:

ILookup<string, int> lookup = 
    selectedBolts.ToLookup(bolt => $"{bolt.Length}_{bolt.Diameter}");

, а затем

int count = lookup["12_36"].Count();
0 голосов
/ 05 февраля 2019

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

Dictionary<string, int> boltFamilyList = selectedBolts
    .GroupBy(bolt => new { bolt.Length, bolt.Diameter })
    .ToDictionary(bolt => bolt.Key, bolt => bolt.Count());

в строке списка вы можете создать ключ:

.ToDictionary(bolt => $"{bolt.Key.Length}_{bolt.Key.Diameter}", bolt => bolt.Count());

Если вы посмотрите на сигнатуру метода Enumerable.ToDictionary, вы увидите, что первый аргумент - Func<TSource,TKey> keySelector, в вашем случае TSource - это анонимный тип, а TKey - этострока.Все, что вам нужно сделать, это определить отображение между TSource и TKey, и это именно то, что делает функция bolt => $"{bolt.Key.Length}_{bolt.Key.Diameter}".

0 голосов
/ 05 февраля 2019

Вы можете отформатировать ключ в группе следующим образом:

Dictionary<string, int> boltFamilyList = selectedBolts
    .GroupBy(bolt => $"{bolt.Length}_{bolt.Diameter}")
    .ToDictionary(bolt => bolt.Key, bolt => bolt.Count());

Ключом вашей группы (и прокси-ключом вашего словаря) будет эта отформатированная строка.

Попробуйтеонлайн

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...