使用循环使用来自对象列表的项填充数组

时间:2012-03-19 00:58:41

标签: c#

我有一个Product类型的列表。 。

public List<Product> products = new List<Product>();

。 。 。我想创建一个方法GetList(string theType),如果方法提供的List参数与任何一个中的theType字段匹配,它将使用Type中的项填充数组。 List中的对象。

我希望数组在返回时只包含所有与提供的theType参数成功匹配的产品的名称

   public string[] GetList(string theType)
        {
            string[] theList = new string[10];
            for(int i = 0; i < theList.Length; i++)
            {
                foreach (Product p in products)
                {
                    if (p.Type.Equals(theType))
                    {
                        theList[i] = p.ProductName; 
                    }
                }
            }
            return theList;
        }

这似乎不起作用。即使我能看到它。我太累了,不能这么想。

编辑:

我想用返回的theList填充一个组合框。 有两个组合框。您必须在第一个中选择一个预设值以启用第二个预设值,然后在第二个中选择应该使用在combobox1中选择的类型的产品项目。我只对combobox1进行了一次事件处理:

    private void combobox1_SelectedValueChanged(object sender, EventArgs e)
            {
                if (combobox1.Text != "")
                {
                    combobox2.Enabled = true;
                    combobox2.Items.Clear();

                    if (combobox1.SelectedText.Equals("Dairy"))
                    {
// i try to display what the method has returned inside a messagebox, but it doesn't display it at all, the messagebox
                        string[] theList = client.GetList("dairy");
                        string theStringList = "";

                        for (int i = 0; i < theList.Length; i++)
                        {
                            theStringList += "\n" + theList[i];
                        }
                        MessageBox.Show(String.Format("{0}"), theStringList);
                        //combobox2.Items.AddRange(client.GetList("dairy"));
                    }
                }
                else
                    combobox2.Enabled = false;
            }

4 个答案:

答案 0 :(得分:6)

使用LINQ:

return products.Where(p => p.Type == theType).Select(p => p.ProductName).ToArray();

答案 1 :(得分:1)

由于您不知道有多少项匹配,请使用List<string>而不是数组:

public IList<string> GetList(string theType)
{
    List<string> matchingProductNames = new List<string>();
    foreach (Product p in products)
    {
        if (p.Type == theType)
           matchingProductNames.Add(p.ProductName);
    }
    return matchingProductNames;
}

这也可以通过Linq以更具表现力的方式(在我看来)完成:

string[] productNames = products.Where(p => p.Type == theType)
                                .Select(p => p.ProductName)
                                .ToArray();

您当前将文本内容显示为消息框的标题,因为它是MessageBox.Show的第二个参数 - 因为您的第一个字符是换行符,但您将看不到任何

MessageBox.Show(String.Format("{0}"), theStringList);

你可能意图MessageBox.Show(string.Format("{0}", theStringList))但是在这里首先使用string.Format是没有意义的,因为你没有应用格式化,只需直接使用字符串:

string theStringList = string.Join("\n", client.GetList("dairy"));
MessageBox.Show(theStringList, "some caption");

答案 2 :(得分:1)

为什么要把它放在for循环中?

public List<String> GetList(string theType)
    {
        List<String> TheList = new List<String>();

            foreach (Product p in products)
            {
                if (p.Type = theType))
                {
                    theList.add(ProductName); 
                }
            }

        return theList;
    }

然后进行编辑(填充组合框)

获取列表后应该使用foreach循环

List<String> iList = GetList("typenamehere")

    foreach(string s in theList){
    Combobox1.Add(s);
    }

然后在选择更改时,您可以检查combobox.selecteditem.text

答案 3 :(得分:1)

public string[] GetList(String theType)
    {
        ArrayList theList = new ArrayList();
        foreach (Product p in products)
        {
            if (p.GetType().ToString() == theType)
                theList.Add(p.ProductName);
        }
        return theList.Cast<string>().ToArray();
    }