0

2 つのポイント (実際には 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 は連続していません。

問題は、与えられた 2 つの点の間の連続した点のリストを返す関数を作成する方法です。

var myLegs = FindMyLegs(legs, 5, 2);

.. 次のリストを返す必要があります: 5, 4, 3, 2

LINQ と脚の内部結合リスト (legs1.pt2Id == feet2.pt1Id) によって 2 回実行される可能性があると思いますが、実際には LINQ の経験がなく、正しい方法を見つけることができません。

基本的に、いくつかの機能が必要です:

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

3 に答える 3

2

あなたの問題を正しく理解していれば、Linq がここでの完全な解決策になるとは思いません。この種の問題に適したデータ構造を構築し、適切なアルゴリズムを選択してパスを見つける必要があると思います。

出発点としてダイクストラのアルゴリズムを見てみましょう。

于 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 に答える