/// <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 }); }
/// <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); }
//加载文本格式地图 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; }
//获取两站之间的所有站点(同一线路上),不存在站点时返回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); } } }