Light12306/TrainInfomationProviderService/TrainInfo/Entities/TrainInfoStorage.cs

110 lines
2.8 KiB
C#
Raw Normal View History

2014-11-21 20:32:36 +08:00
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<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; }
/// <summary>
/// 创建 <see cref="TrainInfoStorage" /> 的新实例(TrainInfoStorage)
/// </summary>
public TrainInfoStorage(IEnumerable<Train> trains)
{
Trains = trains.ToList();
Init();
}
[JsonConstructor]
protected TrainInfoStorage()
{
}
[OnDeserialized]
void DeserializeCallback(StreamingContext context)
{
Init();
}
/// <summary>
/// 初始化
/// </summary>
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);
}
/// <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);
}
}
}
}
}