C# 如何将自定义双向图从QuickGraph应用到Graph#的GraphLayout?

C# 如何将自定义双向图从QuickGraph应用到Graph#的GraphLayout?,c#,graph,quickgraph,C#,Graph,Quickgraph,怎么了 using QuickGraph; using GraphSharp; public class State { public string Name { get; set; } public override string ToString() { return Name; } } pub

怎么了

    using QuickGraph;
    using GraphSharp;

     public class State
        {
            public string Name { get; set; }
            public override string ToString()
            {
                return Name;
            }
        }

     public class Event
        {
            public string Name;
            public override string ToString()
            {
                return Name;
            }
        }

    BidirectionalGraph<State, TaggedEdge<State, Event>> x =
                    new BidirectionalGraph<State, TaggedEdge<State, Event>>();

    GraphLayout graphLayout = new GraphLayout();
    graphLayout.Graph = x;
使用快速图形;
使用图形竖琴;
公共阶级国家
{
公共字符串名称{get;set;}
公共重写字符串ToString()
{
返回名称;
}
}
公开课活动
{
公共字符串名称;
公共重写字符串ToString()
{
返回名称;
}
}
双向图x=
新的双向图();
GraphLayout GraphLayout=新的GraphLayout();
graphLayout.Graph=x;
错误:

无法将类型
QuickGraph.BidirectionalGraph
隐式转换为
QuickGraph.IBidirectionalGraph
。存在显式转换(是否缺少强制转换?)

如果我进行了强制转换,那么应用程序在启动时会在没有任何信息的情况下出错

怎么了?

是的

但是TaggedEdge并没有实现IEdge接口
如何使用自定义TaggedEdge?

您需要使用类型IEdge而不是TaggedEdge创建BidDirectionGraph的实例:

BidirectionalGraph<State, IEdge<State, Event>> x =
                new BidirectionalGraph<State, IEdge<State, Event>>();
双向图x= 新的双向图(); 我不能说我完全理解为什么会出现这种情况,但是上述方法应该有效


编辑:我认为这可以解释为什么这个转换不起作用。

如果您使用自定义图形(即不是“
bidirectionalgraphy您的意思是GraphLayout的Graph属性需要一个
IBidirectionalGraph
对吗?它是从实现IEdge的Edge继承的。您可以创建一个新类,该类将同时实现IEdge和ITAGED。
public MyVertex : State { }
public MyEdge : Edge<MyVertex> {
   public MyEdge (MyVertex source, MyVertex target)
      : base(source, target) { }
public MyGraph : BidirectionalGraph<MyVertex, MyEdge> { }
public MyGraphLayout : ContextualGraphLayout<MyVertex, MyEdge, MyGraph> {
    public MyGraphLayout () : base() { }

    public MyGraphLayout (bool allowParallelEdges)
        : base(allowParallelEdges) { }

    public MyGraphLayout (bool allowParallelEdges, int vertexCapacity)
        : base(allowParallelEdges, vertexCapacity) { }