예제 #1
0
        public static T FromFile <T>(string filename)
        {
            using (var reader = new StreamReader(new FileStream(filename, FileMode.Open)))
            {
                var type = reader.ReadLine();
                if (type != null && type.Equals(typeof(T).ToString()))
                {
                    switch (type)
                    {
                    case "Graphs.Graph":
                    {
                        var gr    = new Graph();
                        var edges = FirstBoot(gr.AddVertex, reader.ReadToEnd());
                        foreach (var edge in edges)
                        {
                            var adgeLoc = edge.Split(new[] { '-', '>', ' ' }, StringSplitOptions.RemoveEmptyEntries);
                            //Если такое ребро уже есть
                            if (gr.Edges.Count(w => w.NextVertex.Name == adgeLoc[0] && w.Previous.Name == adgeLoc[1]) != 1)
                            {
                                gr.AddEdge(adgeLoc[0], adgeLoc[1]);
                            }
                        }
                        return((T)(object)gr);
                    }

                    case "Graphs.OrgGraph":
                    {
                        var gr    = new OrgGraph();
                        var edges = FirstBoot(gr.AddVertex, reader.ReadToEnd());
                        foreach (var edge in edges)
                        {
                            var adgeLoc = edge.Split(new[] { '-', '>', ' ' }, StringSplitOptions.RemoveEmptyEntries);
                            //Если такое ребро уже есть
                            gr.AddEdge(adgeLoc[0], adgeLoc[1]);
                        }
                        return((T)(object)gr);
                    }

                    case "Graphs.WeightGraph":
                    {
                        var gr    = new WeightGraph();
                        var edges = FirstBoot(gr.AddVertex, reader.ReadToEnd());
                        foreach (var edge in edges)
                        {
                            var adgeLoc = edge.Split(new[] { '-', '>', ' ', '|' }, StringSplitOptions.RemoveEmptyEntries);
                            //Если такое ребро уже есть
                            if (gr.Edges.Count(w => w.NextVertex.Name == adgeLoc[0] && w.Previous.Name == adgeLoc[1]) != 1)
                            {
                                gr.AddEdge(adgeLoc[0], adgeLoc[1], double.Parse(adgeLoc[2]));
                            }
                        }
                        return((T)(object)gr);
                    }

                    case "Graphs.WeightOrgGraph":
                    {
                        var gr    = new WeightOrgGraph();
                        var edges = FirstBoot(gr.AddVertex, reader.ReadToEnd());
                        foreach (var edge in edges)
                        {
                            var adgeLoc = edge.Split(new[] { '-', '>', ' ', '|' }, StringSplitOptions.RemoveEmptyEntries);
                            //Если такое ребро уже есть
                            gr.AddEdge(adgeLoc[0], adgeLoc[1], double.Parse(adgeLoc[2]));
                        }
                        return((T)(object)gr);
                    }

                    default:
                    {
                        throw new Exception();
                    }
                    }
                }
                throw new Exception("Тип графа и графа в файле не совпадает");
            }
        }
예제 #2
0
 public static void ToFile(string filename, WeightOrgGraph graph)
 {
     ToFileAdjacencyList(filename, graph);
 }