LINQ-查找“;路径“;沿着腿
本文关键字:路径 LINQ- 查找 | 更新日期: 2023-09-27 18:22:23
假设我有一个由两个点(实际上是PointID)定义的简单"leg"类:
public class Leg
{
public int p1Id;
public int p2Id;
}
腿的列表是"互连的",就像一个腿的pt2和另一个腿(除了第一个和最后一个)的pt1一样。让我们初始化简单列表:
var legs = new List<Leg>();
var l1 = new Leg { p1Id = 1, p2Id = 2 };
var l2 = new Leg { p1Id = 4, p2Id = 5 };
var l3 = new Leg { p1Id = 2, p2Id = 3 };
var l4 = new Leg { p1Id = 5, p2Id = 6 };
var l5 = new Leg { p1Id = 3, p2Id = 4 };
legs.Add(l1);
legs.Add(l2);
legs.Add(l3);
legs.Add(l4);
legs.Add(l5);
事实是,这个腿列表没有排序,当然ID也不是连续的,就像本例中的情况一样。
问题是如何创建函数,该函数将返回两个给定点之间的连续点列表,因此:
var myLegs = FindMyLegs(legs, 5, 2);
应返回以下列表:5、4、3、2
我想这可能是由LINQ和内部legs连接列表两次完成的(legs1.pt2Id==legs2.pt1Id),但我在LINQ方面真的没有经验,也找不到正确的方法。
基本上我需要一些功能:
List<int> FindMyLegs(List<Leg> allLegs, int startPt, int endPt) { ??? }
如果我正确理解你的问题,那么我认为Linq不会是这里的全部解决方案。我认为你需要建立一个适合这类问题的数据结构,然后选择合适的算法来找到你的路径。
以Dijkstra的算法为起点。
我希望这就是您所需要的
private List<int> FindMyLegs(List<Leg> allLegs, int startPt, int endPt)
{
return allLegs.Where(l => l.p1Id <= startPt && l.p1Id >=endPt).Select(l => l.p1Id).OrderByDescending(x => x).ToList();
}
希望它能帮助你:
public static List<int> FindMyLegs(List<Leg> allLegs, int startPt, int endPt)
{
var result = new List<int>();
var pre_result = allLegs.Where(l => (l.p1Id >= startPt && l.p2Id <= endPt) || (l.p2Id <= startPt && l.p1Id >= endPt));
foreach (var leg in pre_result)
{
result.Add(leg.p1Id);
result.Add(leg.p2Id);
}
result = (startPt > endPt ? result.OrderBy(t => t) : result.OrderByDescending(t => t)).Distinct().ToList();
return result;
}
static void Main()
{
var legs = new List<Leg>();
var l1 = new Leg { p1Id = 1, p2Id = 2 };
var l2 = new Leg { p1Id = 4, p2Id = 5 };
var l3 = new Leg { p1Id = 2, p2Id = 3 };
var l4 = new Leg { p1Id = 5, p2Id = 6 };
var l5 = new Leg { p1Id = 3, p2Id = 4 };
legs.Add(l1);
legs.Add(l2);
legs.Add(l3);
legs.Add(l4);
legs.Add(l5);
var myLegs = FindMyLegs(legs, 2, 5);
foreach (var leg in myLegs)
{
Console.WriteLine(leg);
}
}
结果:
var myLegs = FindMyLegs(legs, 2, 5);
54.3.2
var myLegs = FindMyLegs(legs, 4, 1);
12.3.4