Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 将列表转换为不同的类结构_Linq_Ms Access_C# 3.0_Ms Access 2007 - Fatal编程技术网

Linq 将列表转换为不同的类结构

Linq 将列表转换为不同的类结构,linq,ms-access,c#-3.0,ms-access-2007,Linq,Ms Access,C# 3.0,Ms Access 2007,我有一个多段线列表,它是我通过查询包含以下值的access 2007表得到的 +----------+----------+----------+-------+ | ObjectID | VertexId | distance | angle | +----------+----------+----------+-------+ | 1 | 0 | 10 | 45 | | 1 | 1 | 10 | 4

我有一个多段线列表,它是我通过查询包含以下值的access 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列所示,只有三个对象。我想将上面列表中的项目转换为下面格式的类

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

在C语言中实现这一点的最佳/快速方法是什么?它闻起来像Linq。我对Linq完全是个新手,尽管我非常渴望学习和使用它。

假设您的多段线列表是一个包含所有值的数据表:

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

考虑将顶点移动到单独的类:

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

有一个多段线顶点列表一个什么列表?@TimSchmelter-请阅读多段线列表..谢谢Tim..非常可读且简单的答案..是的,我的数据表包含了这些值..@vinayan很好的决定:您也可以使用我的LINQ创建多段线。我将使用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)));
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"))));