Как применить пользовательский двунаправленный граф из QuickGraph в GraphLayout из Graph #? - PullRequest
3 голосов
/ 11 марта 2010

Что не так?

    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>>. Существует явное преобразование (вам не хватает приведения?)

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

Что не так?

Ответы [ 3 ]

2 голосов
/ 20 апреля 2010

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

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

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

РЕДАКТИРОВАТЬ: Я задал вопрос это объясняет, почему этот акт не работает.

1 голос
/ 15 ноября 2013

Если вы используете пользовательский график (т.е. не "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) { }

}

0 голосов
/ 12 марта 2010

Да

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

...