C# 反向多对多词典<;键,列表<;价值>&燃气轮机;

C# 反向多对多词典<;键,列表<;价值>&燃气轮机;,c#,dictionary,C#,Dictionary,事实上让我思考 我意识到,翻阅字典并不是件小事。 最优雅和可读的方式是什么 同一场景学生多对多上课 原始词典,其中键是studentId,值是包含classId的列表,希望还原到词典 谢谢 更新: 事实上,我刚刚测试了Luke和Bruno的解决方案,他们返回了正确数量的已分类数据,无论他们是否有相同的学生,都会随着我的学习而更新。翻字典非常简单: var newDic = oldDic.ToDictionary(x => x.Value, x => x.Key); 就这些 现在,你

事实上让我思考 我意识到,翻阅
字典
并不是件小事。 最优雅和可读的方式是什么

同一场景学生多对多上课

原始
词典
,其中键是studentId,值是包含classId的
列表
,希望还原到
词典

谢谢

更新:
事实上,我刚刚测试了Luke和Bruno的解决方案,他们返回了正确数量的已分类数据,无论他们是否有相同的学生,都会随着我的学习而更新。

翻字典非常简单:

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

现在,你的问题不同了。它是关于逆转建立在字典上的多对多关系

 var newDict =
     table
         .GroupBy(x => x.Entity2,
                  x => x.Entity1,
                  (entity2, entity1) => new {entity1, entity2})
         .ToDictionary(x => x.entity2, x => x.entity1);
假设你有一本字典。其想法是从中提取多对多关系的“中间表”。然后你可以把它重新组合到另一边,然后重新翻译成字典

 var newDict =
     table
         .GroupBy(x => x.Entity2,
                  x => x.Entity1,
                  (entity2, entity1) => new {entity1, entity2})
         .ToDictionary(x => x.entity2, x => x.entity1);
对于第一部分,我们将使用SelectMany的重载

“将序列的每个元素投影到 一个数不清的, 将生成的序列展平为 一个序列,并调用一个结果 每个元素上的选择器函数 在这里。”

因此,现在您只需按照您想要的方式重新组合此表,然后将其转换为字典

 var newDict =
     table
         .GroupBy(x => x.Entity2,
                  x => x.Entity1,
                  (entity2, entity1) => new {entity1, entity2})
         .ToDictionary(x => x.entity2, x => x.entity1);

我不确定这和我的想法到底有什么不同

如果您只是询问如何返回
字典
而不是
字典
,那么您只需要调用该方法

偷窃和修改:

稍有不同的方式(我的大脑更容易理解:)

var newDict=newdictionary();
var dict=新字典();
dict.Add(1,newlist(){1,2,3,4,5});
dict.Add(2,newlist(){1,2,3,4,5});
dict.Add(3,newlist(){1,2,6});
dict.Add(4,newlist(){1,6,7});
dict.Add(5,新列表(){8});
var newKeys=dict.Values.SelectMany(v=>v.Distinct();
foreach(newkey中的var nk)
{
var vals=dict.Keys.Where(k=>dict[k].Contains(nk));
newDict.Add(nk,vals.ToList());
}

问题在于,您必须确保值是唯一的,这是不正确的。阅读问题的内容-为一个学生ID键入一个班级ID列表是没有意义的。我只是尝试了一下,结果是一本字典,我恐怕这不是我要找的。感谢您的回答。通过对主题给出最符合逻辑的答案,您完全无法回答内部问题的内容。有趣,放松点,伙计们!当我看到问题的内容时,我正在编辑它!谢谢卢克,我试图找到一个更简单的解决办法:D,我觉得这很酷,但很难理解。我自己无法理解如何获得这种类型的解决方案,所以我试图简化它。你真是太棒了。它确实回答了我的问题:)您还可以执行以下操作,这会给出一个
ILookup
:var classToStudent=studentToClass.SelectMany(pair=>pair.Value.Select(val=>new{Key=val,Value=pair.Key})).ToLookup(item=>item.Key,item=>item.Value)@如果某个答案令人满意地解决了您的问题,我建议单击它旁边的“复选标记”,将其作为正式答案接受,并奖励给出答案的人。以
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() );
}