Light12306/TrainInfomationProviderService/TrainInfo/Entities/TrainInfoStorage.cs

111 lines
2.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
{
HashSet<string> _hashStore;
[JsonProperty("hl")]
public HashSet<string> HashStore
{
get { return _hashStore ?? (_hashStore = new HashSet<string>(StringComparer.OrdinalIgnoreCase)); }
}
[JsonIgnore]
public List<Train> Trains { get; set; }
[JsonIgnore]
public Dictionary<string, Train[]> TrainsCodeMap { get; private set; }
[JsonIgnore]
public Dictionary<string, Train[]> TrainsIdMap { get; private set; }
/// <summary>
/// 车站-发车车次信息
/// </summary>
[JsonIgnore]
public Dictionary<string, List<Train>> StationLeftTrainData { get; private set; }
/// <summary>
/// 车站-发车车次信息
/// </summary>
[JsonIgnore]
public Dictionary<string, List<Train>> StationArriveTrainData { get; private set; }
/// <summary>
/// 站点路由表
/// </summary>
[JsonIgnore]
public Dictionary<string, HashSet<string>> StationRouteMap { get; private set; }
public TrainInfoStorage()
{
}
[OnDeserialized]
void DeserializeCallback(StreamingContext context)
{
Init();
}
/// <summary>
/// 初始化
/// </summary>
public void Init()
{
//load data
var store = TrainInfoManager.Instance.DataStore.TrainData;
Trains = HashStore.Select(s => store.GetValue(s)).ExceptNull().ToList();
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);
}
/// <summary>
/// 初始化车站->车次信息
/// </summary>
public void InitStationTrainData()
{
StationLeftTrainData = new Dictionary<string, List<Train>>();
StationArriveTrainData = new Dictionary<string, List<Train>>();
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<Train>()).Add(train);
if (i < train.TrainStops.Count - 1)
StationLeftTrainData.GetValue(stop.Code, _ => new List<Train>()).Add(train);
}
}
}
}
}