Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反转图形_C#_Linq_Graph Theory - Fatal编程技术网

C# 反转图形

C# 反转图形,c#,linq,graph-theory,C#,Linq,Graph Theory,(我希望我正确使用了“反转”) 我有一个节点(对象)和边的集合(节点引用的其他对象的列表)。整个图形在字典中表示,您可以简单地反转,只需说“对于每个节点,在其邻居列表中查找具有该节点的所有顶点”(如果有可以访问的节点,但没有任何邻居,则联合是必要的,但如果字典中有一个v->{}形式的条目,则联合是不必要的): 这对我很有用: var result = graph.Keys .Union(graph.SelectMany(x => x.Value)) .Distinct()

(我希望我正确使用了“反转”)


我有一个节点(对象)和边的集合(节点引用的其他对象的列表)。整个图形在
字典中表示,您可以简单地反转,只需说“对于每个节点,在其邻居列表中查找具有该节点的所有顶点”(如果有可以访问的节点,但没有任何邻居,则联合是必要的,但如果字典中有一个
v->{}
形式的条目,则联合是不必要的):

这对我很有用:

var result = graph.Keys
    .Union(graph.SelectMany(x => x.Value))
    .Distinct()
    .ToDictionary(
        x => x, 
        x => graph.Where(y => y.Value.Contains(x)).Select(y => y.Key).ToList()
    );
结合:

foreach (var element in result)
{
    Console.WriteLine(element.Key + ": " + string.Join(", ", element.Value));
}
吐出:

答:
B:D
C:A
D:A,B,C


无论如何,我想我应该提供一个替代方案。您可以直接在原始字典上调用.ToDictionary():

var inverse = graph.Keys
                   .Union(
                       graph.Values
                            .SelectMany(v => v)
                            .Distinct()
                   )
                   .ToDictionary(
                       v => v,
                       v => graph.Keys.Where(key => graph[key].Contains(v))
                   );
var inverse = graph.ToDictionary(
    i => i.Key,
    i => graph.Where(j => j.Value.Contains(i.Key))
              .Select(j => j.Key)
              .Distinct()
              .ToList());

这将选择当前键作为反向字典条目的键,然后通过选择边缘列表值包含目标键的键并调用.ToList(),从原始字典中的对中创建一个新列表。

在“道德等价”示例中,没有“C”数据的是什么?不是“a”在第一个数据集中指向它。@Kirk,那是因为我很迟钝。我在白板上画出了这个例子,但遗漏了一条边!但是,是的,谢谢!这只需要一个边列表就可以了。@Jeff,不幸的是,对象通常不能用
AB BA
格式表示。)还有,安尼的回答到哪里去了?我想说的是,我可以不获取空集,实际上,我不会有任何这样的数据。因为你和Ani的答案几乎相同,但Ani的答案不再存在,那么你就得到了勾号。
foreach (var element in result)
{
    Console.WriteLine(element.Key + ": " + string.Join(", ", element.Value));
}
var inverse = graph.ToDictionary(
    i => i.Key,
    i => graph.Where(j => j.Value.Contains(i.Key))
              .Select(j => j.Key)
              .Distinct()
              .ToList());