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-查找“;路径“;沿着腿

如果我正确理解你的问题,那么我认为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