我有下表:
Track ---------------------- FromStop ToStop 2 3 3 5 3 6 3 7 3 8 5 7 5 8 6 8 7 8 8 9
每个数字代表一个电台,此表中的一个条目代表两个电台之间的一条轨道。
我编写了以下代码来确定2个站点之间的其他站点:
public List<Stop> GetClosestConnectingStops(int fromStopId, int toStopId)
{
using (TrainBlocksEntities objContext = new TrainBlocksEntities())
{
List<Track> trackList;
//2 stops
var x = from n in objContext.Tracks
where (n.FromStop == fromStopId && n.ToStop == toStopId)
//1 switches
|| (n.FromStop == toStopId && n.ToStop == fromStopId)
select n;
trackList = x.ToList<Track>();
if (trackList.Count > 0)
{
List<Stop> stops = new List<Stop>();
if(trackList[0].Stop.Id == fromStopId){
stops.Add(trackList[0].Stop);
stops.Add(trackList[0].Stop1);
}else{
stops.Add(trackList[0].Stop1);
stops.Add(trackList[0].Stop);
}
return stops;
}
//3 stops
var y = from n in objContext.Tracks
from n2 in objContext.Tracks
where (n.FromStop == fromStopId && n.ToStop == n2.FromStop && n2.ToStop == toStopId)
//2 switches
|| (n.FromStop == fromStopId && n.ToStop == n2.ToStop && n2.FromStop == toStopId)
//1 switch
|| (n.ToStop == fromStopId && n.FromStop == n2.FromStop && n2.ToStop == toStopId)
//2 switches
|| (n.ToStop == fromStopId && n.FromStop == n2.ToStop && n2.FromStop == toStopId)
select new StopConcat
{
DepartureStop = n.Stop,
Intermediate1 = n2.Stop,
ArrivalStop = n2.Stop1
};
List<StopConcat> options = y.ToList<StopConcat>();
if (options.Count > 0)
{
Stop[] stops = {options[0].DepartureStop, options[0].Intermediate1, options[0].ArrivalStop};
return stops.ToList<Stop>();
}
//4 stops <---- THIS DOESNT WORK
var z =
from n in objContext.Tracks
from n2 in objContext.Tracks
from n3 in objContext.Tracks
where
(n.FromStop == fromStopId && n2.FromStop == n.ToStop && n3.FromStop == n2.ToStop && n3.ToStop == toStopId)
//3 switches
|| (n.FromStop == fromStopId && n2.FromStop == n.ToStop && n3.ToStop == n2.ToStop && n3.FromStop == toStopId)
//2 switches
|| (n.FromStop == fromStopId && n2.ToStop == n.ToStop && n3.FromStop == n2.FromStop && n3.ToStop == toStopId)
//3 switches
|| (n.FromStop == fromStopId && n2.ToStop == n.ToStop && n3.ToStop == n2.FromStop && n3.FromStop == toStopId)
//1 switch
|| (n.ToStop == fromStopId && n2.FromStop == n.FromStop && n3.FromStop == n2.ToStop && n3.ToStop == toStopId)
//3 switches
|| (n.ToStop == fromStopId && n2.FromStop == n.FromStop && n3.ToStop == n2.ToStop && n3.FromStop == toStopId)
//2 switches
|| (n.ToStop == fromStopId && n2.ToStop == n.FromStop && n3.FromStop == n2.FromStop && n3.ToStop == toStopId)
//3 switches
|| (n.ToStop == fromStopId && n2.ToStop == n.FromStop && n3.ToStop == n2.FromStop && n3.FromStop == toStopId)
select new StopConcat
{
DepartureStop = n.Stop,
Intermediate1 = n.Stop1,
Intermediate2= n3.Stop,
ArrivalStop = n3.Stop1
};
options = z.ToList<StopConcat>();
if (trackList.Count > 0)
{
StopConcat firstOption = options[0];
ArrayList stops = new ArrayList();
if(firstOption.DepartureStop.Id == fromStopId){
stops.Add(firstOption.DepartureStop);
stops.Add(firstOption.Intermediate1);
}
else
{
stops.Add(firstOption.Intermediate1);
stops.Add(firstOption.DepartureStop);
}
if (firstOption.ArrivalStop.Id == toStopId)
{
stops.Add(firstOption.Intermediate2);
stops.Add(firstOption.ArrivalStop);
}
else
{
stops.Add(firstOption.ArrivalStop);
stops.Add(firstOption.Intermediate2);
}
return stops.Cast<Stop>().ToList();
}
return null;
}
}
代码示例:
- GetClosestConnectingStops(2,5) -> {2,3,5} - GetClosestConnectingStops(3,5) -> {3,5}
以上示例有效,但当我尝试连接2个站点和其他2个站点时,该函数返回null。
Expected result: - GetClosestConnectingStops(2,9) -> {2,3,8,9} Actual result - GetClosestConnectingStops(2,9) -> null
我的第三个Linq查询有问题,但我无法弄清楚是什么。