Как применить пользовательский BidirectionalGraph из QuickGraph к GraphLayout из Graph#?

Что случилось?

    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;

Ошибка:

Невозможно неявно преобразовать тип QuickGraph.BidirectionalGraph<ChashaGraphSharp.State,QuickGraph.TaggedEdge<ChashaGraphSharp.State,ChashaGraphSharp.Event>> в QuickGraph.IBidirectionalGraph<object,QuickGraph.IEdge<object>>. Существует явное преобразование (вам не хватает приведения?)

Если я ставлю приведение, то приложение выдает ошибку при запуске без какой-либо информации

Что случилось?


person Dmitry    schedule 11.03.2010    source источник
comment
Вы имеете в виду, что свойство Graph GraphLayout требует IBidirectionalGraph<object,QuickGraph.IEdge<object>>, верно?   -  person Mauricio Scheffer    schedule 11.03.2010


Ответы (3)


Вам нужно создать свой экземпляр BidirectionGraph, используя тип IEdge вместо TaggedEdge:

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

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

EDIT: я задал вопрос такого рода объясняет, почему этот состав не работает.

person Justin    schedule 19.04.2010

Если вы используете пользовательский график (IE не "BidirectionalGraph<Object, IEdge<Object>"), вам необходимо использовать пользовательский GraphLayout, который наследуется от "ContextualGraphLayout"

Здесь вместо «GraphLayout» используйте «ContextualGraphLayout<State,Edge<<State>>,BidirectionalGraph<State, Edge<State>>>».

Я настоятельно рекомендую создавать классы фиктивных моделей, чтобы получить удобочитаемость. Например:

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) { }

}

person Dace    schedule 15.11.2013

да

Но TaggedEdge не реализует интерфейс IEdge. Как использовать собственный TaggedEdge?

person Dmitriy Kudinov    schedule 12.03.2010
comment
Он унаследован от Edge, который реализует IEdge. Вы можете создать новый класс, который будет реализовывать как IEdge, так и ITagged. - person Eugene Auduchinok; 24.04.2016