C# Linq查询不是';当它应该返回任何值时,它不会返回任何值
我有下表: Track ---------------------- FromStop ToStop 2 3 3 5 3 6 3 7 3 8 5 7 5 8 6 8 7 8 8 9 跟踪 ---------------------- 从头到尾 2 3 3 5 3 6 3 7 3 8 5 7 5 8 6 8 7 8 8 9 每个数字代表一个车站,本表中的一个条目代表两个车站之间的轨道线 我编写了以下代码来确定两个站点之间的其他站点:C# Linq查询不是';当它应该返回任何值时,它不会返回任何值,c#,mysql,linq,C#,Mysql,Linq,我有下表: Track ---------------------- FromStop ToStop 2 3 3 5 3 6 3 7 3 8 5 7 5 8 6 8 7 8 8 9 跟踪 ---------------------- 从头到尾 2 3 3 5 3 6 3 7
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;
}
}
public List GetClosestConnectingStops(int-fromStopId,int-toStopId)
{
使用(TrainBlockSenties objContext=new TrainBlockSenties())
{
列表跟踪列表;
//2站
var x=从objContext.Tracks中的n开始
其中(n.FromStop==fromStopId&&n.ToStop==toStopId)
//1开关
||(n.FromStop==toStopId&&n.ToStop==fromStopId)
选择n;
trackList=x.ToList();
如果(trackList.Count>0)
{
列表停止=新建列表();
if(轨迹列表[0].Stop.Id==fromStopId){
停止。添加(轨迹列表[0]。停止);
stops.Add(轨迹列表[0].Stop1);
}否则{
stops.Add(轨迹列表[0].Stop1);
停止。添加(轨迹列表[0]。停止);
}
返回站;
}
//3站
变量y=从objContext.Tracks中的n开始
从objContext.Tracks中的n2开始
其中(n.FromStop==fromStopId&&n.ToStop==n2.FromStop&&n2.ToStop==toStopId)
//2个开关
||(n.FromStop==fromStopId&&n.ToStop==n2.ToStop&&n2.FromStop==toStopId)
//1开关
||(n.ToStop==fromStopId&&n.FromStop==n2.FromStop&&n2.ToStop==toStopId)
//2个开关
||(n.ToStop==fromStopId&&n.FromStop==n2.ToStop&&n2.FromStop==toStopId)
选择新的StopConcat
{
出发站,
中间层1=n2.停止,
ArrivalStop=n2.Stop1
};
列表选项=y.ToList();
如果(options.Count>0)
{
Stop[]stops={options[0]。DepartureStop,options[0]。Intermediate1,options[0]。ArrivalStop};
返回停止。ToList();
}
//4站(0)
{
StopConcat firstOption=选项[0];
ArrayList停止=新建ArrayList();
if(firstOption.DepartureStop.Id==fromStopId){
stops.Add(firstOption.DepartureStop);
stops.Add(firstOption.Intermediate1);
}
其他的
{
stops.Add(firstOption.Intermediate1);
stops.Add(firstOption.DepartureStop);
}
if(firstOption.ArrivalStop.Id==toStopId)
{
stops.Add(firstOption.Intermediate2);
stops.Add(firstOption.ArrivalStop);
}
其他的
{
stops.Add(firstOption.ArrivalStop);
stops.Add(firstOption.Intermediate2);
}
返回停止.Cast().ToList();
}
返回null;
}
}
代码示例:
- GetClosestConnectingStops(2,5) -> {2,3,5}
- GetClosestConnectingStops(3,5) -> {3,5}
-GetCloseStConnectionStops(2,5)->{2,3,5}
-GetClosestConnectionStops(3,5)->{3,5}
上面的示例是有效的,但是当我尝试将两个站点与两个其他站点连接在一起时,函数返回null
Expected result:
- GetClosestConnectingStops(2,9) -> {2,3,8,9}
Actual result
- GetClosestConnectingStops(2,9) -> null
预期结果:
-GetClosestConnectionStops(2,9)->{2,3,8,9}
实际结果
-GetCloseStConnectionStops(2,9)->null
我的第三个Linq查询有问题,但我无法找出问题所在。这里介绍的是图形中的路径检测。假设你的图形不像示例中那样大,我建议创建一个图形数据结构,将数据从数据库加载到数据库中,然后使用已知的算法遍历图形,比如寻找最短路径。我曾考虑过使用Dijkstra的算法,但我以前从未使用过,所以我不确定如何合并它。我也是Linq的新手,所以任何例子都非常感谢。看看这个。有一个答案提到了一个可能为您处理所有工作的库。您的实现似乎归结为对特殊情况的分析。如果您使用一些常见的“最短路径”算法,您将更容易获得更可靠的结果,例如。