2012-03-19 114 views
1

我有一個類型爲Product的列表。 。 。使用循環從對象列表中填充項目數組

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

。 。 。並且我想創建一個方法GetList(string theType),如果該方法提供的theType參數與List中的任何對象內的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; 
     } 

這似乎並不奏效。即使我可以看到它。我太累了想不出來。

編輯:

我想填充ComboBox與返回theList。 有兩個組合框。您必須在第一個選項中選擇一個預設值以啓用第二個預設值,並且應該使用combobox1中選擇的產品類型填充第二個預設值。我只有一個事件處理對於ComboBox:

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

使用==不等於。 – Joe 2012-03-19 01:10:03

+0

編輯我的答案,以適應您的編輯 – 2012-03-19 11:37:43

回答

6

使用LINQ:

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

1行代碼,我喜歡。 – 2012-03-19 11:25:58

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"); 
+0

我嘗試了在這裏建議的一切。問題是我想使用返回的'theList'來使用'AddRange()'填充組合框,但它不會更新。 – Bob 2012-03-19 01:21:39

+0

你應該顯示相關的代碼然後 - 還要確保你的方法實際上確實返回匹配項 – BrokenGlass 2012-03-19 01:24:18

+0

我已經更新了原始帖子和事件處理的combobox1代碼。 – Bob 2012-03-19 01:31:31

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

然後爲您編輯(填充組合框)

你應該得到的名單

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

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

然後選擇更改,您可以檢查combobox.selecteditem後使用foreach循環。文字

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