C# - 向列表中的列表添加数据

6
我该如何将表格中的数据添加到名为“Vehicles”的列表中?
```html

enter image description here

```
public class criterias
{
    public double values { get; set; }
    public double time { get; set; }
}

public class movChannels
{
    public string name { get; set; }
    public IList<criterias> criteria = new List<criterias>();
}

public class stepsList
{
    public string steps { get; set; }
    public IList<movChannels> stepChannelsCriteria = new List<movChannels>();
}

public class vehicles
{
    public int vehID { get; set; }
    public string vehDescription { get; set; }
    public IList<stepsList> vehValCriteria = new List<stepsList>();
}

现在,我该如何将表格中的数据添加到名为“Vehicles”的列表中?以后我会创建其他车辆...

1
从初始化 vehicles 实例并设置其 vehIDvehDescription 开始。然后创建 stepsList 实例并将其添加到 vehValCriteria List 等。 - Dovydas Šopa
5个回答

13

你做了一些错误的决定,其中有些是设计缺陷,有些是次要的C#命名约定违规。

值得一提的几个缺陷:

  1. vehID 应该是 string 而不是 int(例如 "XPT")
  2. Movment 有 Name、Value 和 Time。它没有值和时间的列表。

创建:

List<Vehicle> vehicles = new List<Vehicle>();

Vehicle vehicle = new Vehicle()
{
    Id = "XPT",
    Description = "Average Car",
    Steps = new List<Step>()
    {
        new Step() {
            Name = "move car",
            Movements = new List<Movement>()
            {
                new Movement("engage 1st gear", 1, 1),
                new Movement("reach 10kph", 10, 5),
                new Movement("maintain 10kph", 10, 12),
            }
        },
        new Step() {
            Name = "stop car",
            Movements = new List<Movement>()
            {
                new Movement("reach 0kph", 10, 4),
                new Movement("put in neutral", 0, 1),
                new Movement("turn off vehicle", 0, 0),
            }
        }
    }
};
vehicles.Add(vehicle);

实体:

public class Movement
{
    public string Name { get; set; }
    public double Values { get; private set; }
    public double Time { get; private set; }

    public Movement(string name, double values, double time)
    {
        Name = name;
        Values = values;
        Time = time;
    }
}

public class Step
{
    public string Name { get; set; }
    public IList<Movement> Movements { get; set; }
}

public class Vehicle
{
    public string Id { get; set; } // Should be changed to string
    public string Description { get; set; }
    public IList<Step> Steps { get; set; }
}

@peetman,代码已更新。(在末尾添加了vehicles.Add(...); - Orel Eraki
1
如果我对每个运动有多个条件,那么我是否应该像我在问题中建议的那样,用另一个类替换Values和Time?谢谢。 - peetman
@peetman,确实,干得好。如果你还不能实现它,请告诉我,我会重构代码。如果这篇文章回答了你的问题,请随意点赞和接受答案。 - Orel Eraki
谢谢。如何在另一个类(.cs)中访问创建的列表? - peetman
不同的问题应该放在不同的线程中。你可以在你喜欢的搜索引擎上找到许多关于这个问题的答案(其中很多答案会指向StackOverflow)。此外,如果有帮助的话,你还可以点赞并接受答案。 - Orel Eraki
显示剩余2条评论

1
你应该按照以下方式创建你的类:
public class criterias
{
    public double values { get; set; }
    public double time { get; set; }
}

public class movChannels
{
    public movChannels
    {
        criteria = new List<criterias>();
    }
    public string name { get; set; }
    public IList<criterias> criteria { get; set; }
}

public class stepsList
{
    public stepsList
    {
        stepChannelsCriteria = new List<movChannels>();
    }
    public string steps { get; set; }
    public IList<movChannels> stepChannelsCriteria { get; set; }
}

public class vehicles
{
    public vehicles
    {
        vehValCriteria = new List<stepsList>();
    }
    public int vehID { get; set; }
    public string vehDescription { get; set; }
    public IList<stepsList> vehValCriteria { get; set; }
    public movChannels movments { get; set; }
}

0

那个怎么样?

public class VehiclesViewModel
{
    public List<vehicles> Vehicles { get; private set; }

    public void Initalize()
    {
      this.Vehicles  = new List<vehicles>();

        var vehicle = new vehicles
                       {
                           vehID = 1,
                           vehDescription = "firstDescription",
                       };
        var stepsList = new stepsList
                        {
                            steps = "firstStep",
                        };
        var movChannel = new movChannels
                          {
                              name = "firstChannel",
                          };
        var criteria = new criterias
                        {
                            values = 0.5,
                            time = 0.5
                        };

        movChannel.criteria.Add(criteria);
        stepsList.stepChannelsCriteria.Add(movChannel);
        vehicle.vehValCriteria.Add(stepsList);

        this.Vehicles.Add(vehicle);
    }
}

0

看起来您的表中 VehicleId 的类型为字符串。请确保 Vehicle 类中的 VehicleId 属性也相符。

您可以使用集合初始化器来设置子对象的值,例如:

 var data = new vehicles()
        {
            vehID = 1,
            vehDescription = "Average Car",
            vehValCriteria = new List<stepsList>()
            {
                new stepsList()
                {
                    steps = "Move car",
                    stepChannelsCriteria = new List<movChannels>()
                    {
                        new movChannels()
                        {
                            name = "engage firstgear",
                            criteria = new List<criterias>()
                            {
                                new criterias()
                                {
                                    values = 1,
                                    time = 1
                                },
                            }
                        },
                        new movChannels()
                        {
                            name = "reach 10kph",
                            criteria = new List<criterias>()
                            {
                                new criterias()
                                {
                                    values = 10,
                                    time = 5
                                },
                            }
                        },
                        new movChannels()
                        {
                            name = "maintain 10kph",
                            criteria = new List<criterias>()
                            {
                                new criterias()
                                {
                                    values = 10,
                                    time = 12
                                },
                            }
                        }
                    }
                },
                new stepsList()
                {
                    steps = "stop car",
                    stepChannelsCriteria = new List<movChannels>()
                    {
                        new movChannels()
                        {
                            name = "reach okph",
                            criteria = new List<criterias>()
                            {
                                new criterias()
                                {
                                    values = 10,
                                    time = 4
                                },
                            }
                        },
                        new movChannels()
                        {
                            name = "put in neutral",
                            criteria = new List<criterias>()
                            {
                                new criterias()
                                {
                                    values = 0,
                                    time = 1
                                },
                            }
                        },
                        new movChannels()
                        {
                            name = "turn off vehicle",
                            criteria = new List<criterias>()
                            {
                                new criterias()
                                {
                                    values = 0,
                                    time = 0
                                },
                            }
                        }
                    }
                }
            }
        };

0

您可以从上到下填写列表,例如

  • 创建Criterias List,然后创建movChannel对象并将其添加到Criterias对象中,以此类推

但是,如果您想避免这种方式,还有另一种方法。如果您正在使用Linq To List,则请按照以下步骤进行操作

将简单的平面对象转换为列表对象

var TableData = db.Tablename.Tolist(); 

然后像这样填写您自己的对象

Vehicles finalList = TableData.Select(a => new Vehicles()
{
    vehID = a.Id,
    vehDescription = a.des,
    vehValCriteria = TableData.Where(b => b.StepslistId == a.StepslistId)
    .Select(c => new StepsList()
    {
                steps = c.Steps,
                stepChannelsCriteria = TableData.Where(d => d.channelId == c.channelId)
                .select(e => new MovChannels()
                {
                    name = e.name,
                    criteria = TableData.Where(f => f.criteriasId = e.criteriasId)
                    .Select(g => new Criterias()
                    {
                        values = g.Values,
                        time = g.Time

                    }).ToList()
                }).ToList()
         }).ToList()
    }).ToList();

这是填充列表中的标准方法


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接