2014-12-07 104 views
1

我已經添加了多個值到一個數組使用3個不同的類,我創建時,我使用foreach循環我只從第一類獲取值是否有任何方式使用foreach多個班級?使用foreach循環從數組中檢索值

AdvertDao advert = new AdvertDao(); 
var array = new ArrayList(); 

array = advert.fillAdvert(); 

foreach (Member m in array) 
{ 
    txtBoxEmail.Text = m.Email; 
    txtBoxPhone.Text = m.Phone.ToString(); 
    txtBoxUsername.Text = m.Username; 
} 

foreach (Consoles c in array) 
{ 
    cmbConsole.Text = c.ConsoleName; 
} 

foreach (Advert a in array) 
{ 
    cmbGenre.Text = a.Genre; 
    lblDateStarted.Text = a.Date.ToString("dd/MM/yyyy"); 
    txtBoxPrice.Text = a.Price.ToString(); 
    txtBoxName.Text = a.Name; 
    txtBoxDesc.Text = a.Description; 
} 

fillAdvert()方法:

public ArrayList fillAdvert() 
{ 
    Member member = new Member(); 
    Advert advert = new Advert(); 
    Consoles console = new Consoles(); 
    Picture picture = new Picture(); 

    ArrayList advertList = new ArrayList(); 

    if (!DatabaseConnection.IsOpen) 
    { 
     DatabaseConnection.Open(); 
    } 
    OracleCommand cmd = new OracleCommand(); 
    cmd.Connection = DatabaseConnection.Connection; 

    string str = "SELECT * FROM ADVERT_ADPIC_MEMBER_CONSOLE WHERE username = '" + GlobalVariables.Username + "' AND name = '" + GlobalVariables.SellingName + "'"; 

    cmd.CommandText = str; 

    OracleDataReader dr = cmd.ExecuteReader(); 

    while (dr.Read()) 
    { 
     member.Username = dr.GetString(0); 
     member.MemberID = dr.GetInt32(1); 
     member.Phone = dr.GetInt32(2); 
     member.Email = dr.GetString(3); 
     console.ConsoleName = dr.GetString(5); 
     advert.Description = dr.GetString(6); 
     advert.Genre = dr.GetString(7); 
     advert.Date = dr.GetDateTime(8); 
     advert.Price = dr.GetDouble(9); 
     advert.Name = dr.GetString(4); 

     advertList.Add(member); 
     advertList.Add(console); 
     advertList.Add(advert); 
    } 

    return advertList; 
} 

可能是一個更簡單的方法,但他們希望在大學完成了它的方式。

+0

而不是使用三個類,爲什麼不使用一個包含這三個類的所有屬性的類? – ekad 2014-12-07 11:50:09

+0

講師希望數據庫中的每個表有不同的類,我曾問過我可以使用一個,但被告知他們需要分開。我知道這會讓它更容易一個 – user3433399 2014-12-07 11:55:34

回答

1

您可以使用一個foreach塊作爲元素類型,但您需要檢查元素的類型,將元素轉換爲正確的類型,並根據元素的類型實現邏輯。

foreach (object obj in array) 
{ 
    if (obj is Member) 
    { 
     Member m = (Member)obj; 
     txtBoxEmail.Text = m.Email; 
     txtBoxPhone.Text = m.Phone.ToString(); 
     txtBoxUsername.Text = m.Username; 
    } 
    else if (obj is Consoles) 
    { 
     Consoles c = (Consoles)obj; 
     cmbConsole.Text = c.ConsoleName; 
    } 
    else if (obj is Advert) 
    { 
     Advert a = (Advert)obj; 
     cmbGenre.Text = a.Genre; 
     lblDateStarted.Text = a.Date.ToString("dd/MM/yyyy"); 
     txtBoxPrice.Text = a.Price.ToString(); 
     txtBoxName.Text = a.Name; 
     txtBoxDesc.Text = a.Description; 
    } 
} 
0

foreach循環要求對象實現System.Collections.IEnumerable或System.Collections.Generic.IEnumerable接口。

所以,答案是「否」 在foreach循環中沒有直接使用多個對象的方法。

如果你讓你的三個類實現相同的接口,一種方法就是使用接口和foreach循環。例如:

public interface IInterface 
{ 
    string Text { get; } 
} 

然後,如果你在每一個類實現這個接口,你可以做這樣的事情:

foreach (IInterface i in array) 
{ 
    //do whatever you want with the text here. 
} 

但是,你將能夠使用只有你在接口實現的屬性。 因此,如果您需要「不同」屬性(取決於對象),則必須使用某種類型的指示符,並在循環內部使用if或switchs,還必須在界面中實現所有必需的屬性。

+0

'ArrayList' *確實*實現'IEnumerable',請看這裏:http://msdn.microsoft.com/en-us/library/system.collections.arraylist%28v=vs .110%29.aspx – ekad 2014-12-07 12:12:26

+0

它實現了,但是如果你有一個以上的類型,你需要使用一個通用的接口來作爲一件事情來使用它。但我同意你的答案中的「如果」選項對於有問題的情況可能是最好的:) – Jauch 2014-12-07 12:14:35