【问题标题】:Access object parameters from a List in C#从 C# 中的列表访问对象参数
【发布时间】:2018-10-29 05:38:58
【问题描述】:

我正在创建一个包含许多不同参数的代理对象列表,但我不确定如何使用循环访问我的所有对象的特定参数......我正在寻找什么要做的是从我所有的代理那里获得所有的 Point3d 职位。我该怎么做?

// Define Agent class
class Agent
{
    Point3d Pos = new Point3d();
    Vector3d Vec = new Vector3d();
    int Alignment;
    double Separation;
    double Cohesion;
    double NeighborRadius;

    public Agent(Point3d pos, Vector3d vec, int alignment, double separation, double cohesion, double neighborRadius)
    {
        Pos = pos;
        Vec = vec;
        Alignment = alignment;
        Separation = separation;
        Cohesion = cohesion;
        NeighborRadius = neighborRadius;
    }
}

protected override void SolveInstance(IGH_DataAccess DA)
{
    // Initialize Agents
    for (int i = 0; i < agents; i++)
    {
        double xPos = RandomfromDouble(0.0, boundx);
        double yPos = RandomfromDouble(0.0, boundy);
        double zPos = RandomfromDouble(0.0, boundz);

        Point3d pos = new Point3d(xPos, yPos, zPos);        // Create Agent Start Position
        Vector3d vec = new Vector3d(xPos + 1, yPos, zPos);  // Create Agent Start Vector

        Agent agent = new Agent(pos, vec, alignment, separation, cohesion, neighborRadius);
        allAgents.Add(agent);
        agentPositions.Add(pos);
    }
}

【问题讨论】:

  • allAgents.Select(z =&gt; z.Pos)

标签: c# grasshopper


【解决方案1】:

如果您可以更改 Pos 的访问修饰符:

class Agent
{
    public Point3d Pos = new Point3d();
    //.
    //.
    //.
}

class Agent
{
    public Agent()
    {
       Pos = new Point3d();
    }
    public Point3d Pos { get;private set; }
    //.
    //.
    //.
}

List<Agent> allAgents = new List<Agent>();
List<Point3d> agentPositions = new List<Point3d>();

// Initialize Agents
//.
//.
//.


agentPositions = allAgents
            .Select(agent => agent.Pos)
            .ToList();

注意:Linq 可从 .Net Framework 3.5 获得

【讨论】:

    【解决方案2】:
    class Agent
    {
        public Point3d Pos {get; private set;}
        public Agent() 
        {
            Pos = new Point3d();
        }
        ....
    }
    foreach (Agent ag in allAgents)
    {
        Console.WriteLine(ag.Pos); //might need to dereference a specific member like x,y, or z
    }
    

    【讨论】:

      【解决方案3】:

      您无法访问 Point3d Pos,因为默认情况下它是私有的。所以使用下面的公共访问修饰符,希望它能解决这个问题:

      public Point3d Pos = new Point3d();
      

      【讨论】:

        猜你喜欢
        • 2020-03-31
        • 1970-01-01
        • 1970-01-01
        • 2017-02-02
        • 2017-12-29
        • 2011-09-12
        • 1970-01-01
        • 1970-01-01
        • 2021-06-06
        相关资源
        最近更新 更多