C#/VB.net: как переключить словарь key=string, value=list of string с помощью LINQ

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

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

пример:

входной словарь:

keys:
Key1: Values: 
            va11
            val2
            val3
Key2: Values:
            val2
            val4
            val5

Key3: Values:
            val1
            val5
            val6

ожидаемый выходной словарь:

keys:
val1: Values: 
            key1
            key3
val2: Values:
            Key1
val3: Values:
            key1
val4: Values: 
            key2
val5: Values:
            Key2
            Key3
val6: Values:
            key3

До сих пор я использовал цикл foreach во втором цикле foreach для чтения существующего словаря и заполнения нового.

_M210_simplified — входной словарь (строки, списка (строки))

Код для заполнения нового диска:

Dim oonew As New Dictionary(Of String, List(Of String))
            For Each oo In _M210_simplified
                Dim olist = oo.Value
                For Each osub In olist
                    If oonew.ContainsKey(osub) Then
                        oonew.Item(osub).Add(oo.Key)
                    Else
                        Dim oln As New List(Of String)
                        oln.Add(oo.Key)
                        oonew.Add(osub, oln)
                    End If
                Next
            Next

Но в случае огромных данных (в словаре будет более 100 000 записей), я думаю, что производительность, вероятно, будет намного лучше при использовании linq с лямбда-функциями.

мне нужен правильный синтаксис LINQ в VB.Net или C# для этого перевода

Спасибо

Было бы полезно опубликовать свой код, например, цикл foreach.

rshepp 19.02.2023 23:52

спасибо @NineBerry за редактирование сообщения, теперь оно намного лучше читается!

Megaspace67 19.02.2023 23:54

Код в комментариях не существует. Ваш код принадлежит вашему вопросу, где его можно увидеть. У вас есть возможность редактировать свой пост, используя ссылку под тегами.

Ken White 19.02.2023 23:57

LINQ не является средством повышения производительности. Вообще говоря, код LINQ будет работать хуже, чем лучшая альтернатива. LINQ — это способ сделать ваш код более кратким. Снижение производительности, как правило, будет незначительным, но оно будет.

jmcilhinney 19.02.2023 23:57

Разместите код в своем вопросе. Мой совет: если вы обнаружите, что создаете коллекции коллекций, создайте класс, который представляет данные и поведение.

Dour High Arch 19.02.2023 23:58
var index = dict.SelectMany(i => i.Value.Select(v => new {i.Key, v})).ToLookup(i => i.v, i => i.Key)?
GSerg 20.02.2023 00:02

Вы можете (слегка) оптимизировать свой код, заменив внутренний For Each циклом For, а затем использовать TryGetValue вместо ContainsKey, чтобы не выполнять два поиска.

NetMage 20.02.2023 21:37
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
7
83
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не уверен, почему люди утверждают, что этот вопрос не ясен.

Это правда, что выполнение этого в LINQ может быть не более производительным, но компилятор может оптимизировать длинные запросы LINQ, когда они перечисляются.

С другой стороны, поиск ключей по словарю, как и в вашем цикле, выполняется очень быстро, поэтому ваш цикл может быть еще быстрее. Единственный способ убедиться в этом — проверить.

Это один из способов сделать это в одном запросе LINQ, по существу сводя ваш первый словарь к {diction1.Value, Dictionary1.Key}, а затем группируя их по Dictionary1.Value, так что вы получаете все ключи Dictionary1 для каждого словаря1. ценить:

var dictionary1 = new Dictionary<string, List<string>>();
Dictionary<string, List<string>> dictionary2;

dictionary2 = dictionary1
//flatten:
.SelectMany(dict1KeyValue => 
    dict1KeyValue.Value.Select(dict1Value => new { dict1Value, dict1Key = dict1KeyValue.Key})) 
.GroupBy(flattened => flattened.dict1Value) // Group up by dictionary1's values
.ToDictionary(
    dict1ValueGroup => dict1ValueGroup.Key, 
    dict1ValueGroup => dict1ValueGroup.Select(vg => vg.dict1Key).ToList());

Компилятор не оптимизирует длинные цепочки запросов LINQ. Существует некоторая оптимизация преобразования запросов LINQ в объекты, представляющие запрос, но она довольно минимальна. Существует множество оптимизаций компилятора для циклов for и foreach.

NetMage 20.02.2023 21:30

@zola25. Спасибо за ответ, предоставленные коды дают вполне ожидаемый результат.

Megaspace67 20.02.2023 21:47

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

Megaspace67 20.02.2023 21:50

Другие вопросы по теме