using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; using TrainInfomationProviderService.StationInfo; namespace TrainInfomationProviderService.TrainInfo.Entities { public class TrainInfoStorage { [JsonProperty("l")] public List Trains { get; set; } [JsonIgnore] public Dictionary TrainsCodeMap { get; private set; } [JsonIgnore] public Dictionary TrainsIdMap { get; private set; } /// /// 车站-发车车次信息 /// [JsonIgnore] public Dictionary> StationLeftTrainData { get; private set; } /// /// 车站-发车车次信息 /// [JsonIgnore] public Dictionary> StationArriveTrainData { get; private set; } /// /// 站点路由表 /// [JsonIgnore] public Dictionary> StationRouteMap { get; private set; } /// /// 创建 的新实例(TrainInfoStorage) /// public TrainInfoStorage(IEnumerable trains) { Trains = trains.ToList(); Init(); } [JsonConstructor] protected TrainInfoStorage() { } [OnDeserialized] void DeserializeCallback(StreamingContext context) { Init(); } /// /// 初始化 /// public void Init() { TrainsCodeMap = Trains.GroupBy(s => s.Code).ToDictionary(s => s.Key, s => { var arr = s.ToArray(); //if (arr.Length > 1) //{ // Trace.TraceWarning("[TRAIN_INFO_STORAGE] 警告:车次编号 {0} 出现重复数据,请查证,重复次数:{1}", s.Key, arr.Length - 1); //} return arr.ToArray(); }, StringComparer.OrdinalIgnoreCase); TrainsIdMap = Trains.GroupBy(s => s.Id).ToDictionary(s => s.Key, s => { var arr = s.ToArray(); //if (arr.Length > 1) //{ // Trace.TraceWarning("[TRAIN_INFO_STORAGE] 警告:车次ID {0} 出现重复数据,请查证,重复次数:{1}", s.Key, arr.Length - 1); //} return arr; }, StringComparer.OrdinalIgnoreCase); } /// /// 初始化车站->车次信息 /// public void InitStationTrainData() { StationLeftTrainData = new Dictionary>(); StationArriveTrainData = new Dictionary>(); foreach (var train in Trains) { for (int i = 0; i < train.TrainStops.Count; i++) { var stop = train.TrainStops[i]; if (i > 0) StationArriveTrainData.GetValue(stop.Code, _ => new List()).Add(train); if (i < train.TrainStops.Count - 1) StationLeftTrainData.GetValue(stop.Code, _ => new List()).Add(train); } } } } }