Инвертируйте many-many Словарь <ключ, Список <значение>>

Существует хороший bookmarklet, названный Визуальное Событие , которое может показать Вам все события, присоединенные к элементу. Это нанесло цветную маркировку на выделения для различных типов событий (мышь, клавиатура, и т.д.). Когда Вы нависаете над ними, это показывает тело обработчика событий, как это было присоединено, и файл/номер строки (на WebKit и Opera). Можно также инициировать событие вручную.

Это не может найти каждое событие, потому что нет никакого стандартного способа искать, какие обработчики событий присоединены к элементу, но это работает с популярными библиотеками как jQuery, Прототип, MooTools, YUI, и т.д.

23
задан Community 23 May 2017 в 10:30
поделиться

3 ответа

Немного по-другому (во всяком случае, немного более понятным для моего мозга :) ...

var newDict = new Dictionary<int, List<int>>();
var dict = new Dictionary<int, List<int>>();
dict.Add( 1, new List<int>() { 1, 2, 3, 4, 5 } );
dict.Add( 2, new List<int>() { 1, 2, 3, 4, 5 } );
dict.Add( 3, new List<int>() { 1, 2, 6 } );
dict.Add( 4, new List<int>() { 1, 6, 7 } );
dict.Add( 5, new List<int>() { 8 } );

var newKeys = dict.Values.SelectMany( v => v ).Distinct();

foreach( var nk in newKeys )
{
   var vals = dict.Keys.Where( k => dict[k].Contains(nk) );
   newDict.Add( nk, vals.ToList() );
}
8
ответ дан 29 November 2019 в 01:18
поделиться

Я не совсем уверен, чем это отличается от вашего предыдущего вопроса .

Если вы просто спрашиваете, как вернуть Dictionary > , а не Dictionary > , тогда все, что вам нужно, это вызов метода ToList .

Кража и изменение Ответ Мехрдада на ваш другой вопрос :

var classToStudent = studentToClass
    .SelectMany(
        pair => pair.Value.Select(val => new { Key = val, Value = pair.Key }))
    .GroupBy(item => item.Key)
    .ToDictionary(gr => gr.Key, gr => gr.Select(item => item.Value).ToList());
3
ответ дан 29 November 2019 в 01:18
поделиться

Чтобы перевернуть словарь, нужно очень просто:

var newDic = oldDic.ToDictionary(x => x.Value, x => x.Key);

Вот и все.

Теперь ваш вопрос в другом. Речь идет об изменении отношения «многие ко многим», установленного в словаре.

Итак, допустим, у вас есть Dictionary >. Идея состоит в том, чтобы извлечь из этого «среднюю таблицу» отношения «многие ко многим». Затем вы можете перегруппировать его с другой стороны, IEnumerable , сглаживает полученные последовательности в одна последовательность и вызывает результат селекторная функция для каждого элемента там. "

var table =
    dict.SelectMany(
        x => x.Value,
        (dictEntry, entryElement) => new
               {
                      Entity1 = dictEntry.Key,
                      Entity2 = entryElement
               }
    );

Итак, теперь вам просто нужно перегруппировать эту таблицу так, как вы хотите, а затем преобразовать ее в словарь.

 var newDict =
     table
         .GroupBy(x => x.Entity2,
                  x => x.Entity1,
                  (entity2, entity1) => new {entity1, entity2})
         .ToDictionary(x => x.entity2, x => x.entity1);
46
ответ дан 29 November 2019 в 01:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: