1

以下の値を保持するポリラインのリスト(アクセス2007テーブルを照会して取得したもの)があります。

+----------+----------+----------+-------+
| ObjectID | VertexId | distance | angle |
+----------+----------+----------+-------+
|        1 |        0 |       10 |    45 |
|        1 |        1 |       10 |    44 |
|        1 |        2 |       20 |    60 |
|        2 |        0 |        5 |    35 |
|        2 |        1 |        6 |    35 |
|        2 |        2 |        4 |    56 |
|        2 |        3 |       12 |    45 |
|        3 |        0 |       20 |    30 |
|        3 |        1 |       10 |    12 |
+----------+----------+----------+-------+

ObjectId 列が示すように、オブジェクトは 3 つしかありません。上記のリストのアイテムを以下の形式のクラスに変換したいと思います..

Class Polyline
{
    int ObjectID;
    list<int> vertices;
    list<double> distances;
    list<double> angles;
}

以下のように、ポリライン オブジェクトのリストを保持し、各固有のポリラインをループできるようにします。

foreach(Polyline polyObj in Polylines)
{
    //do something with the polyline object;

}

C#でこれを行うための最良/高速な方法は何ですか? それはLinqのにおいがします..私はlinqの初心者ですが、それを学び、使用することに非常に熱心です..

4

2 に答える 2

1

ポリラインのリストDataTableがすべての値を保持する であると仮定します。

List<Polyline> polylines =
    tblPolyline.AsEnumerable()
   .GroupBy(p => p.Field<int>("ObjectID"))
   .Select(grp => new Polyline()
   {
       ObjectID = grp.Key,
       Vertices = new List<int>(grp.Select(p => p.Field<int>("VertexId"))),
       Distances = new List<double>(grp.Select(p => p.Field<double>("distance"))),
       Angles = new List<double>(grp.Select(p => p.Field<double>("angle"))),
   }).ToList();
于 2012-05-14T07:24:59.373 に答える
1

頂点を別のクラスに移動することを検討してください。

public class PolyLine
{
    public PolyLine(int id, IEnumerable<Vertex> vertices)
    {
        Id = id;
        Vertices = new List<Vertex>(vertices);
    }

    public int Id { get; private set; }
    public List<Vertex> Vertices { get; private set; }
}

public class Vertex
{
    public Vertex(int id, int distance, int angle)
    {
        Id = id;
        Distance = distance;
        Angle = angle;
    }

    public int Id { get; private set; }
    public int Distance { get; private set; }
    public int Angle { get; private set; }
}

そして、ポリラインを作成するための LINQ は次のとおりです。

var polylines = from r in records
                group r by r.ObjectID into g
                select new PolyLine(g.Key, g.Select(r => new Vertex(r.VertexId, r.Distance, r.Angle)));

更新: LINQ to DataSet バージョン

var polylines = from r in table.AsEnumerable()
                group r by r.Field<int>("ObjectID") into g
                select new PolyLine(g.Key, 
                             g.Select(r => new Vertex(r.Field<int>("VertexId"),
                                                      r.Field<int>("distance"), 
                                                      r.Field<int>("angle"))));
于 2012-05-14T07:25:42.527 に答える