예제 #1
0
        /// <summary>
        /// Takes a subway line item and adds it to the dictionary. If the item exists, it adds it to that entries sorted set. If the entry does not, it creates
        /// that entry in the dictionary.
        /// </summary>
        /// <param name="item"><see cref="SubwayLine"/></param>
        private void UpdateTimetable(SubwayLine item)
        {
            var newItem = new SubwayInfo
            {
                LineId        = item.Name,
                LineInfo      = item,
                DateForRecord = DateTime.UtcNow
            };

            if (subwayTimes.ContainsKey(item.Name))
            {
                var set = subwayTimes[item.Name];
                set.Add(newItem);
                return;
            }

            subwayTimes.Add(item.Name, new SortedSet <SubwayInfo> {
                newItem
            });
        }
예제 #2
0
        /// <summary>
        /// Returns each MTA Subway lines and their status. The text of the alert is used to determine the status per line
        /// </summary>
        /// <returns>List of lines and associated status</returns>
        public async Task <List <SubwayLine> > GetLinesAsync()
        {
            var service = await _repo.GetServiceAsync();

            var result = new List <SubwayLine>();

            foreach (var name in SubwayNames)
            {
                var line = service.Subway.OrderBy(s => s.Name).FirstOrDefault(s => s.Name.Contains(name));

                var subwayLine = new SubwayLine
                {
                    Name   = name,
                    Status = null == line ?
                             ServiceStatus.UNKNOWN : line.Text.Contains(string.Format("[{0}]", name)) ?
                             line.Status : ServiceStatus.GOOD_SERVICE
                };

                result.Add(subwayLine);
            }

            return(result);
        }
예제 #3
0
        //加载文本格式地图
        private void LoadTxtMap(string txtMapPath)
        {
            try
            {
                using (StreamReader sr = new StreamReader(txtMapPath))
                {
                    string line;

                    while (true)
                    {
                        SubwayLine subwayLine = new SubwayLine();
                        subwayLine.IsCircle = false;
                        subwayLine.InLineSubwayStationsNames = new List <string>();
                        string[] stationsInfo;
                        //获取地铁线路名
                        if ((line = sr.ReadLine()) != null)
                        {
                            Match lineNameMatch = Regex.Match(line, @"^@([0-9a-zA-Z\u4E00-\u9FA5]+)");
                            if (lineNameMatch.Success)
                            {
                                subwayLine.IsCircle = true;
                                subwayLine.Name     = lineNameMatch.Groups[1].Value;
                            }
                            else if (Regex.Match(line, @"^([0-9a-zA-Z\u4E00-\u9FA5]+)").Success)
                            {
                                subwayLine.Name = line;
                            }
                            else
                            {
                                throw new Exception("地铁线路名格式有误");
                            }
                        }
                        else
                        {
                            return;
                        }

                        //获取此地铁线上所有地铁站名与地铁站所在地铁线路名
                        line         = sr.ReadLine();
                        stationsInfo = Regex.Split(line, " ");
                        foreach (string stationInfo in stationsInfo)
                        {
                            //添加地铁站点名
                            Match stationNameMatch = Regex.Match(stationInfo, @"^[0-9a-zA-Z\u4E00-\u9FA5]+");
                            if (!stationNameMatch.Success)
                            {
                                throw new Exception("地铁站名格式有误");
                            }
                            subwayLine.InLineSubwayStationsNames.Add(stationNameMatch.Value);

                            //若地铁站为记录于系统中,则添加到stations中
                            if (!stations.Contains(stationNameMatch.Value))
                            {
                                Station station = new Station();
                                station.PlacedSubwayLineName = new List <string>();

                                station.Name = stationNameMatch.Value;

                                //添加所在地铁线路名
                                station.PlacedSubwayLineName.Add(subwayLine.Name);
                                MatchCollection subwayLineMatchCollection = Regex.Matches(stationInfo, @"\[([0-9a-zA-Z\u4E00-\u9FA5]+)\]");
                                foreach (Match m in subwayLineMatchCollection)
                                {
                                    if (!m.Success)
                                    {
                                        throw new Exception("地铁站名格式有误");
                                    }
                                    station.IsTransferStation = true;
                                    station.PlacedSubwayLineName.Add(m.Groups[1].Value);
                                }

                                stations.Add(station.Name, station);
                            }
                        }

                        subwayLines.Add(subwayLine.Name, subwayLine);
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("文件无法读取");
                Console.WriteLine(e.Message);
                System.Environment.Exit(0);
            }

            return;
        }
예제 #4
0
        //获取两站之间的所有站点(同一线路上),不存在站点时返回null
        private List <string> getBetweenStations(string station1Name, string station2Name)
        {
            int           station1SubwayLineIndex, station2SubwayLineIndex;
            string        stationLinesName          = GetStationsLineNames(station1Name, station2Name)[0];
            SubwayLine    subwayLine                = (SubwayLine)map.SubwayLines[stationLinesName];
            List <string> stationsInSubwauLine      = new List <string>();
            List <string> outerStationsInSubwauLine = new List <string>();

            station1SubwayLineIndex = subwayLine.InLineSubwayStationsNames.FindIndex((string stationName) => stationName == station1Name);
            station2SubwayLineIndex = subwayLine.InLineSubwayStationsNames.FindIndex((string stationName) => stationName == station2Name);

            if (station1SubwayLineIndex + 1 < station2SubwayLineIndex)
            {
                for (int i = station1SubwayLineIndex + 1; i < station2SubwayLineIndex; i++)
                {
                    stationsInSubwauLine.Add(subwayLine.InLineSubwayStationsNames[i]);
                }
            }
            else if (station1SubwayLineIndex > station2SubwayLineIndex + 1)
            {
                for (int i = station1SubwayLineIndex - 1; i > station2SubwayLineIndex; i--)
                {
                    stationsInSubwauLine.Add(subwayLine.InLineSubwayStationsNames[i]);
                }
            }
            //考虑到回环的地铁线路,需要另一方向的路线记录
            if (subwayLine.IsCircle)
            {
                if (station1SubwayLineIndex < station2SubwayLineIndex && station1SubwayLineIndex + subwayLine.InLineSubwayStationsNames.Count - station2SubwayLineIndex > 0)
                {
                    for (int i = station1SubwayLineIndex - 1; i >= 0; i--)
                    {
                        outerStationsInSubwauLine.Add(subwayLine.InLineSubwayStationsNames[i]);
                    }
                    for (int i = subwayLine.InLineSubwayStationsNames.Count - 1; i > station2SubwayLineIndex; i--)
                    {
                        outerStationsInSubwauLine.Add(subwayLine.InLineSubwayStationsNames[i]);
                    }
                }
                else if (station1SubwayLineIndex > station2SubwayLineIndex && station2SubwayLineIndex + subwayLine.InLineSubwayStationsNames.Count - station1SubwayLineIndex > 0)
                {
                    for (int i = station1SubwayLineIndex + 1; i < subwayLine.InLineSubwayStationsNames.Count; i++)
                    {
                        outerStationsInSubwauLine.Add(subwayLine.InLineSubwayStationsNames[i]);
                    }
                    for (int i = 0; i < station2SubwayLineIndex; i++)
                    {
                        outerStationsInSubwauLine.Add(subwayLine.InLineSubwayStationsNames[i]);
                    }
                }
            }
            //返回路径最小的间隔站点信息
            if (stationsInSubwauLine.Count == 0 && outerStationsInSubwauLine.Count == 0)
            {
                return(null);
            }
            else if (stationsInSubwauLine.Count != 0 && outerStationsInSubwauLine.Count == 0)
            {
                return(stationsInSubwauLine);
            }
            else if (stationsInSubwauLine.Count != 0 && outerStationsInSubwauLine.Count == 0)
            {
                return(outerStationsInSubwauLine);
            }
            else
            {
                if (stationsInSubwauLine.Count <= outerStationsInSubwauLine.Count)
                {
                    return(stationsInSubwauLine);
                }
                else
                {
                    return(outerStationsInSubwauLine);
                }
            }
        }