【问题标题】:Retrieving values from an array using foreach loop使用 foreach 循环从数组中检索值
【发布时间】:2014-12-07 11:38:24
【问题描述】:

我使用 foreach 循环时创建的 3 个不同的类向数组添加了多个值我只从第一个类中获取值有没有办法在多个类上使用 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;
}

可能是一种更简单的方法,但这是他们希望在大学里完成的方式。

【问题讨论】:

  • 不使用三个类,为什么不只使用一个包含这三个类的所有属性的类?
  • 讲师希望数据库中的每个表都有不同的类,我曾问我是否可以使用一个,但被告知它们需要分开。我知道这会让它变得更容易

标签: c# arrays loops foreach


【解决方案1】:

可以使用一个foreach块,以object为元素类型,但需要检查元素的类型,将元素转换为正确的类型,并根据元素的类型实现逻辑.

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;
    }
}

【讨论】:

    【解决方案2】:

    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 或开关。

    【讨论】:

    • ArrayList 确实实现了IEnumerable,见这里:msdn.microsoft.com/en-us/library/…
    • 它实现了,但是如果你有多个类型,你需要使用一个通用的接口将它作为一个单一的东西来使用。但我同意您的答案中的“如果”选项可能最适合所讨论的情况:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 2015-04-12
    • 2017-10-10
    相关资源
    最近更新 更多