0

假设我有两个点(实际上是 PointID)定义的简单“腿”类:

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 和内部连接列表两次完成的(legs1.pt2Id ==legs2.pt1Id),但我真的没有 LINQ 经验,我找不到正确的方法。

基本上我需要一些功能:

List<int> FindMyLegs(List<Leg> allLegs, int startPt, int endPt) { ??? }
4

3 回答 3

2

如果我正确理解您的问题,那么我认为 Linq 不会是这里的全部解决方案。我认为你需要建立一个适合这类问题的数据结构,然后选择合适的算法来找到你的路径。

Dijkstra 算法为起点。

于 2013-07-13T19:33:24.590 回答
1

我希望这是你需要的

    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();
    }
于 2013-07-13T19:49:25.297 回答
1

希望它可以帮助你:

    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);

5 4 3 2

var myLegs = FindMyLegs(legs, 4, 1);

1 2 3 4

于 2013-07-13T19:50:11.620 回答