2011-07-27 85 views
1

我想訪問一個對象,它是一個對象數組的成員,這可能嗎?如何訪問對象數組內的對象實例?

我已經聲明瞭一個名爲Particle的結構,並初始化了一個「粒子」約40個粒子的對象數組,現在我需要訪問每個粒子,例如:particle.Gbest 任何人都可以幫忙?

這裏是我的代碼:

struct particle 
{ 
    double[] position = new double[100]; 
    double Gbest, Lbest; 
    double Pconst = 0.5; 
} 

object[] swarm = new object[swarm_size]; 

for (int i = 0; i < swarm_size; i++) 
{ 
    swarm[i] = new particle(); 
} 
+0

您沒有「粒子」數組您有一個「對象」數組。 –

+0

而不是對象[]你應該使用粒子[] ..超越,我不知道你在問什麼? –

回答

5

此代碼是無效的開始:

struct particle 
{ 
    double[] position = new double[100]; 
} 

不能指定爲在結構中的實例變量的變量初始化。

但是,訪問另一個對象或數值內的數據很容易 - 如果可訪問的話。在這種情況下,你的字段是私人的,你沒有提供任何訪問方法或屬性,所以你將無法在沒有更多代碼的情況下「從外部」獲取它們。

下面是一些修改代碼:

public class Particle 
{ 
    private readonly double[] positions = new double[100]; 

    // TODO: Rename these to something useful 
    public double Gbest { get; private set; } 
    private double Lbest; 
    private double Pconst = 0.5; 

    public Particle(int g) 
    { 
     Gbest = g; // Or whatever 
    } 
} 


List<Particle> swarm = new List<Particle>(); 
for (int i = 0; i < swarmSize; i++) 
{ 
    swarm.Add(new Particle(i)); 
} 

double total = 0; 
foreach (Particle particle in swarm) 
{ 
    total += particle.Gbest; 
} 

現在,這不是做什麼特別有用,因爲它目前還不清楚你想要做什麼 - 但我會建議你在C#入門書。堆棧溢出對於特定的問題非常有用,但我認爲你已經足夠早進入C#程序,一本好書或者教程能夠幫助你更多。

+0

謝謝澄清Jon, – Che

0

如果你知道粒子的索引,你可以簡單地使用:

particle part = (particle)swarm[i]; 
// do stuff with part 

如果你不知道索引,你可以在它們之間迭代:

foreach(particle part in swam) 
{ 
    // do stuff with part 
} 

或者你可以使用Linq-to-Objects來做更復雜的東西,但我認爲你需要從簡單的東西開始...

順便說一句,如果可以的話,宣佈swarm爲:

particle[] swarm = new particle[swarm_size]; 

並獲得類型安全的好處。

0
struct particle 
    { 
     public double[] position = new double[100]; 
     public double Gbest, Lbest; 
     public double Pconst = 0.5; 
    } 

    particle[] swarm = new particle[swarm_size]; 
     for (int i = 0; i < swarm_size; i++) 
      { 
      swarm[i] = new particle(); 
      } 

    foreach(particle p in swarm) 
    { 
     // do magic here 
    } 
+0

謝謝ShaneC,那爲我工作 – Che

1
var swarm = new particle[swarm_size]; 

for (int i = 0; i < swarm_size; i++) 
{ 
    swarm[i] = new particle(); 
} 

訪問數組的屬性,你可以走這樣的:

for (int i = 0; i < swarm_size; i++) 
{ 
    Console.WriteLine(swarm[i].Gbest); 
    Console.WriteLine(swarm[i].Lbest); 
} 

編輯swarm聲明是不正確的。

+0

我不認爲這是可行的。編譯器並不是你的對象[]包含粒子類型。也許你把swarm聲明爲對象數組是錯誤的? – musefan

+0

@musefan:在我的示例中,'swarm'被定義爲'new particle [swarm_size]',它爲編譯器提供了關於其中包含的數據的足夠信息。 – Yuck

+0

以及我的編譯器(使用VS 2010 Net 4.0)不喜歡它。只識別「對象」屬性 – musefan

0

你可以改變你的數組類型的粒子,並與指數一樣訪問它...

particle[] swarm = new particle[swarm_size]; 
particle firstParticle = swarm[0]; 

,或者你可以把對象回顆粒...

particle firstParticle = (particle)swarm[0]; 

我會出於性能原因推薦第一個選項。